https://leetcode-cn.com/contest/weekly-contest-114/problems/tallest-billboard/
給出一個集合,詢問能否挑出兩個不重疊的子集,使得兩個子集內的數字和一樣,求數字和最大是多少。
一開始枚舉所有集合然后dp一波果斷T了。
正解是f(i,j)表示前i個數字,組成的兩個集合差為j的時候較大的集合內的數字和,然后枚舉一下三種情況dp即可。
一開始少算了一種情況,是把第i加在較小的集合里,仍沒超過較大的集合。
1 class Solution { 2 public: 3 #define inf 0x3f3f3f3f 4 int tallestBillboard(vector<int>& rods) { 5 int f[21][5005]; 6 memset(f,-inf,sizeof(f)); 7 f[0][0]=0; 8 for(int i=0;i<rods.size();++i){ 9 for(int j=0;j<=5000;++j){ 10 f[i+1][j]=max(f[i+1][j],f[i][j]); 11 if(j>=rods[i]&&f[i][j-rods[i]]!=-inf)f[i+1][j]=max(f[i+1][j],rods[i]+f[i][j-rods[i]]); 12 if(rods[i]>=j&&f[i][rods[i]-j]!=-inf)f[i+1][j]=max(f[i+1][j],j+f[i][rods[i]-j]); 13 if(j+rods[i]<=5000&&f[i][j+rods[i]])f[i+1][j]=max(f[i+1][j],f[i][j+rods[i]]); 14 } 15 } 16 return max(0,f[rods.size()][0]); 17 } 18 };