[Dynamische Programmierung] 01 Rucksackproblem: Katze und Hund Krieg

Ein Zahlenstapel wird in zwei Gruppen aufgeteilt
(1) die Zahl jeder Gruppe darf sich nur um eins unterscheiden
(2) die Differenz zwischen der Summe jeder Gruppe ist so gering wie möglich
Eingabe: n, n Zahlen
Ausgabe: die Summe von jeder Gruppe

01 Rucksack:

Die Summe aller Zahlen ist Summe. Wenn Sie möchten, dass die Summe der beiden Zahlenmengen so klein wie möglich ist, dann sollten die beiden Zahlenmengen so nahe wie möglich an Summe/2 liegen.


Wenn die Zahl gerade ist, wähle n/2 Zahlen und die Kapazität ist Summe/2, sodass der Wert am größten ist. Wenn die
Zahl ungerade ist, wähle n/2 Zahlen und die Kapazität ist Summe/2, was ist Wählen Sie daher unter den n Zahlen n/2 Zahlen so aus, dass ihre Summe die größte
ist und Summe/2 nicht überschreitet

dp[i][j][k]: Wähle k Zahlen aus den ersten i Zahlen so aus, dass ihre Summe j nicht überschreitet und das Maximum
dp[i][j][k]=max(dp[i-1][ j] [k],dp[i-1][jw[i]][k-1]+w[i])
fortlaufendes Array:
dp[j][k]=max(dp[j][k], dp[jw[i]][k-1]+w[i]) 

Code

#include<iostream>
#include<cstring>
using namespace std;
int n;
int w[201];
int dp[10000][201];
int main()
{
	memset(dp,0,sizeof(dp));
	cin>>n;
	int sum=0;
	for(int i=1;i<=n;i++){
		cin>>w[i];
		sum+=w[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=sum/2;j>=w[i];j--){
			for(int k=1;k<=n/2;k++){
				dp[j][k]=max(dp[j][k],dp[j-w[i]][k-1]+w[i]);
			}
		}
	}
	cout<<dp[sum/2][n/2];
}

Ich denke du magst

Origin blog.csdn.net/m0_52043808/article/details/123978251
Empfohlen
Rangfolge