P4377 [USACO18OPEN] Talent Show G (gourmand + 01 sac à dos + 01 planning)

description du sujet

Le fermier John souhaite emmener ses n vaches, numérotées 1...n pour plus de commodité, à la foire agricole pour participer à l'exposition annuelle du bétail ! Le poids de sa ième vache est wi​, et le niveau de talent est ti​, tous deux étant des nombres entiers.

À son arrivée, le fermier John a été intimidé par les nouvelles règles du Da Niu Show de cette année :

(i) Un groupe de vaches participant à une compétition doit avoir un poids total d'au moins W (afin de garantir que l'équipe forte participe à la compétition, et pas seulement une vache forte), et.

(2) Le groupe avec le plus grand ratio entre la valeur totale du talent et le poids total gagne.

FJ remarque que le poids total de toutes ses vaches n'est pas inférieur à W, il peut donc envoyer une équipe qui répond à la règle (1). Aidez-le à déterminer le rapport talent/poids optimal qui peut être atteint dans une telle équipe.

format d'entrée

La première ligne est composée de deux nombres entiers, représentant le nombre n de bovins et la limite de poids total W.

Lignes 2 à (n+1), chaque ligne a deux entiers, et l'entier de la ligne (i+1) représente le poids wi​ et le niveau de talent t_iti​ de la i vache.

format de sortie

Demandez à l'agriculteur d'utiliser un groupe de vaches dont le poids total est d'au moins W pour obtenir le rapport entre la valeur totale maximale possible du talent et le poids total.

Si votre réponse est A, affichez la valeur de 1000A arrondie à l'inférieur afin que la sortie soit un entier (lorsque le nombre en question n'est pas un entier, l'opération d'arrondi supprime toutes les décimales lors de l'arrondi à une partie entière).

Exemples d'entrée et de sortie

Tapez #1 pour copier

3 15
20 21
10 11
30 31

copie de la sortie n°1

1066

Idées :

Il y a 2 conditions à considérer dans cette question :

1. Un groupe de vaches participant au concours doit avoir un poids total d'au moins W

2. L’équipe avec le plus grand ratio entre la valeur totale des talents et le poids total gagne

La deuxième condition appartient à la question de savoir s'il faut ou non choisir cette vache. C'est mon premier problème de planification du score 01.

Lorsque la première condition n'est pas inférieure à W, la programmation dynamique peut être utilisée mais le résultat final est dp[W]

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f, N = 255, WW = 1005;
int n, W;
struct { int w, t; double y; }cow[N];
double dp[WW];
bool check(double x) {
	int i, j;
	for (int i = 1; i <= n; i++) cow[i].y = (double)cow[i].t - x * cow[i].w;//0/1规划的基础思路
	for (int i = 1; i <= W; i++) dp[i] = -INF;
	dp[0] = 0;
	// 0-1背包的思想 一维
	for (int i = 1; i <= n; i++) {
		for (int j = W; j >= 0; j--) { // 当前背包的大小
			if (j + cow[i].w >= W) dp[W] = max(dp[W], dp[j] + cow[i].y); //超过了这个了贪心是否选这个
			else dp[j + cow[i].w] = max(dp[j+ cow[i].w], dp[j] + cow[i].y);
		}
	}
	return dp[W] < 0; // true x大了 我们要使 x尽可能大
}
int main() {
	cin >> n >> W;
	for (int i = 1; i <= n; i++) cin >> cow[i].w >> cow[i].t;
	double L = 0, R = 0;
	for (int i = 1; i <= n; i++) R += cow[i].t;
	for (int i = 0; i < 50; ++i) {
		double mid = L + (R - L) / 2;
		if (check(mid)) R = mid;
		else L = mid;
	}
	cout << (int)(L * 1000) << endl;
	return 0;
}

Acho que você gosta

Origin blog.csdn.net/zhi6fui/article/details/128616811
Recomendado
Clasificación