0-1揹包問題(動態規劃)
阿新 • • 發佈:2018-11-07
http://acm.hdu.edu.cn/showproblem.php?pid=1171
這道題咋看有點複雜,其實也只是換了一種思維,因為題目要求要儘量平均分配,所以我們可以先將總價值sum求出,然後得出其分配的平均值為sum/2,要注意這個答案可能為小數,但是又因為sum是整數,所以最後得出的sum/2是要小於等於實際的值。將這個結果進行01,揹包,可以得出其中一個宿舍所得的最大價值,而另一個宿舍的最大價值也可以相應的得到,而前者必定小於等於後者。
#include<iostream> #include<cstring> #include<algorithm> #define INF 1000005 using namespace std; int d[1005][1005]; int v[5005]; int main(){ int n; while(cin >> n,n>0) { int sum = 0; for(int i = 1,k = 0;k < n;k++) { int e,f; cin >> e >> f; sum += e*f; while(f--) v[i++] = e; } for(int i = 1;i <= n;i++) { for(int j = 0;j <= sum/2;j++){ d[i][j] = (i == 1?0:d[i-1][j]); if(j >= v[i]) d[i][j] = max(d[i][j],d[i-1][j-v[i]]+v[i]); } } cout << sum - d[n][sum/2] << " " << d[n][sum/2] << endl; memset(d,0,sizeof(d)); } return 0; }