感觉还是类似01背包,相比于01背包直接
f[i][w]=max(f[i-1][w],f[i-1][w-w[i]]+value[i]);
这个的最后一个要根据当前总容量是否能整出t,是否剩余的部分>=t分情况下,开始忘了在else时f[i][j]=f[i][j-1]呢,还是不熟练啊,循环开始就该写了
我的1次ac啊....
1 /* 2 3 ID: hubiao cave 4 5 PROG: rockers 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include<iostream> 15 16 #include<fstream> 17 18 #include<vector> 19 20 using namespace std; 21 22 23 24 int main() 25 26 { 27 28 29 ifstream fin("rockers.in"); 30 31 ofstream fout("rockers.out"); 32 33 int m,n,t; 34 vector<int> vec; 35 fin>>n>>t>>m; 36 for(int i=0;i<n;i++) 37 { 38 int temp; 39 fin>>temp; 40 if(temp<=t) 41 vec.push_back(temp); 42 } 43 44 45 int dp[21][401]; 46 for(int i=0;i<=400;i++) 47 dp[0][i]=0; 48 for(int i=1;i<=vec.size();i++) 49 { 50 if(i==15) 51 i=15; 52 for(int j=1;j<=m*t;j++) 53 if(j>=vec[i-1]) 54 { 55 if(j%t==0) 56 dp[i][j]=max(dp[i-1][j],dp[i-1][j-vec[i-1]]+1); 57 else 58 { 59 int p=j%t; 60 if(j/t>0) 61 { 62 if(p>=vec[i-1]) 63 dp[i][j]=max(dp[i-1][j],dp[i-1][j-vec[i-1]]+1); 64 else 65 dp[i][j]=max(dp[i-1][j],dp[i-1][j-p-vec[i-1]]+1); 66 } 67 else 68 { 69 if(p>=vec[i-1]) 70 dp[i][j]=max(dp[i-1][j],dp[i-1][j-vec[i-1]]+1); 71 else 72 dp[i][j]=dp[i-1][j]; 73 } 74 } 75 } 76 else 77 dp[i][j]=dp[i-1][j]; 78 79 } 80 fout<<dp[n][t*m]<<endl; 81 return 0; 82 83 84 }