P4377 [USACO18OPEN] Talentshow G (gierig + 01 Rucksack + 01 Planung)

Themenbeschreibung

Bauer John möchte seine n Kühe, der Einfachheit halber mit 1...n nummeriert, zur Landwirtschaftsmesse mitnehmen, um an der jährlichen Viehschau teilzunehmen! Das Gewicht seiner i-ten Kuh ist wi und die Talentstufe ist ti, beides sind ganze Zahlen.

Bei seiner Ankunft war Farmer John von den neuen Regeln der diesjährigen Da Niu Show eingeschüchtert:

(i) Eine Gruppe von Kühen, die an einem Wettbewerb teilnehmen, muss ein Gesamtgewicht von mindestens W haben (damit soll sichergestellt werden, dass das starke Team am Wettbewerb teilnimmt und nicht nur eine starke Kuh), und.

(2) Die Gruppe mit dem größten Verhältnis von Gesamttalentwert zu Gesamtgewicht gewinnt.

FJ stellt fest, dass das Gesamtgewicht aller seiner Kühe nicht weniger als W beträgt, sodass er ein Team entsenden kann, das Regel (1) erfüllt. Helfen Sie ihm, das optimale Talent-Gewicht-Verhältnis zu ermitteln, das in einem solchen Team erreicht werden kann.

Eingabeformat

Die erste Zeile besteht aus zwei ganzen Zahlen, die die Anzahl n der Rinder und die Gesamtgewichtsgrenze W darstellen.

Zeilen 2 bis (n+1), jede Zeile hat zwei Ganzzahlen, und die Ganzzahl in Zeile (i+1) stellt das Gewicht wi​ und das Talentniveau t_iti​ der i-Kuh dar.

Ausgabeformat

Bitten Sie den Landwirt, eine Gruppe von Kühen zu verwenden, deren Gesamtgewicht mindestens W beträgt, um das Verhältnis des maximal möglichen Gesamttalentwerts zum Gesamtgewicht zu erhalten.

Wenn Ihre Antwort A lautet, geben Sie den Wert von 1000A abgerundet aus, sodass die Ausgabe eine ganze Zahl ist (wenn die betreffende Zahl keine ganze Zahl ist, entfernt die Rundungsoperation beim Abrunden auf einen ganzzahligen Teil alle Dezimalstellen).

Eingabe- und Ausgabebeispiele

Geben Sie zum Kopieren #1 ein

3 15 
20 21 
10 11 
30 31

Ausgabe Nr. 1 Kopie

1066

Ideen:

Bei dieser Frage sind zwei Bedingungen zu berücksichtigen:

1. Eine Gruppe von Kühen, die am Wettbewerb teilnehmen, muss ein Gesamtgewicht von mindestens W haben

2. Das Team mit dem größten Verhältnis von Gesamttalentwert zu Gesamtgewicht gewinnt

Die zweite Bedingung bezieht sich auf die Frage, ob diese Kuh ausgewählt werden soll oder nicht. Dies ist mein erstes 01-Score-Planungsproblem.

Wenn die erste Bedingung nicht kleiner als W ist, kann dynamische Programmierung verwendet werden, aber das Endergebnis ist 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;
}

Ich denke du magst

Origin blog.csdn.net/zhi6fui/article/details/128616811
Empfohlen
Rangfolge