C++ löst das Rucksackproblem 01

beschreiben

Du bist ein Entdecker. Eines Tages findest du in einer geheimnisvollen Höhle N Schmuckstücke. Auf jedem Schmuckstück steht sein Gewicht w und sein Wert vi. Da Sie es relativ spät entdeckt haben, kann es an diesem Ort jederzeit zu Unfällen wie einem Einsturz kommen. In diesem Fall müssen Sie darüber nachdenken, einen Teil des Schmucks in Ihren Handgepäckrucksack zu packen, damit sich die Reise lohnt. Da Sie jedoch eine schlanke Statur haben und das Gesamtgewicht des Schmucks, den Sie mitnehmen können, W nicht überschreitet, wie werden Sie sich entscheiden?

Eingabeformat

Die erste Zeile: N M, was N Schmuckstücke angibt, Ihre Tragfähigkeit W

Als nächstes folgen N Zeilen. Geben Sie in jede Zeile wi vi ein und geben Sie das Stückgewicht und den Stückpreis des i-ten Schmuckstücks an.

Ausgabeformat

Eine Linie stellt den Wert dar, wie Sie den Schmuck am besten mitnehmen können.

Beispiel

eingeben

[3 Schmuckstücke, Gesamtbelastbarkeit 10]

[Schmuckgewicht [9,5,5]] [Schmuckwert [9,5,5]]

3 10
9 9
5 5
3 5

Ausgabe

[Sie sollten das zweite und dritte Schmuckstück zum Mitnehmen auswählen. Das Gesamtgewicht von 8 ist geringer als Ihr eigenes Gewicht und der Gesamtwert beträgt 10]

10

Code

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main() {
	int N,W;
	cin>>N>>W;

	vector<int> w(N+1,0);
	vector<int> v(N+1,0);
	for(int i=1; i<=N; i++) {
		cin>>w[i]>>v[i];
	}

	vector<vector<int> > res(N+1,vector<int>(W+1,0));
	for(int i=1; i<=N; i++) {
		for(int j=0; j<=W; j++) {
			if(j<w[i]) {
				res[i][j]=res[i-1][j];
			} else {
				res[i][j]=max(res[i-1][j],res[i-1][j-w[i]]+v[i]);
			}
		}
	}

	cout<<res[N][W]<<endl;
	return 0;
}

Operationsergebnis

3 10
9 9
5 5
3 5
10

--------------------------------
Process exited after 6.262 seconds with return value 0
请按任意键继续. . .

analysieren

 Behandeln Sie das zweidimensionale Array res als Lösungsraum. Die erste Dimension zeigt an, dass die Entscheidung für die ersten paar Schmuckstücke getroffen wurde. 

 Die zweite Dimension gibt an, dass die Rucksacklast genutzt wurde und mithilfe des dynamischen Programmieralgorithmus gelöst wird.

Für das i-te Schmuckstück besteht bei nicht ausreichender Restkapazität kein Unterschied zur Tatsache, dass das Schmuckstück nicht mehr verfügbar ist, sodass der Gesamtpreis unverändert bleibt.

Wenn jedoch die verbleibende Kapazität ausreicht, müssen Sie den Gesamtpreis für die Ladung vergleichen und die beste Lösung auswählen.

Für Freunde, die Sie gerade kennengelernt haben, kann es schwierig sein, es zu verstehen. Seien Sie also nicht ungeduldig. Sie werden es verstehen, nachdem Sie es ein paar Mal gelesen haben.

 Da die Zahlen im Beispiel relativ klein sind, können Sie eine zweidimensionale Tabelle erstellen, um res zum besseren Verständnis darzustellen.

Guess you like

Origin blog.csdn.net/qq_36694133/article/details/134984350