http://acm.hdu.edu.cn/showproblem.php?pid=4501
这到题可以算一个三维的背包吧 ,之前把题义理解错了~以为以0积分或0钱那的就算免费的 原来不是~~可以拿任意价值的。
看了别人的代码也学到了一点小技巧,比如dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]])(这不是这道题的转移方程) 如果用滚动数组要注意内循环的顺序,但不用滚动数组会浪费空间
所以可以这样dp[2][j] 通过^进行 dp[now][j=max(dp[now^1][j],dp[now^1][j-c[i]]), 这样可以尽量减少空间复杂度,又可以不用考虑循环顺序。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int N = 110; 7 8 int dp[2][N][N][7]; 9 int c1[N], c2[N], val[N]; 10 int main() 11 { 12 int n, v1, v2, k; 13 while(~scanf("%d %d %d %d", &n, &v1, &v2, &k)) 14 { 15 for(int i = 1; i <= n; i++) 16 { 17 scanf("%d %d %d", c1 + i, c2 + i, val + i); 18 } 19 memset(dp, 0, sizeof(dp)); 20 int now = 0; 21 for(int i = 1; i <= n; i++) 22 { 23 now = now ^ 1; 24 for(int j = 0; j <= v1; j++) 25 { 26 for(int l1 = 0; l1 <= v2; l1++) 27 { 28 for(int l2 = 0; l2 <= k; l2++) 29 { 30 dp[now][j][l1][l2] = dp[now ^ 1][j][l1][l2]; 31 if(j >= c1[i]) 32 dp[now][j][l1][l2] = max(dp[now][j][l1][l2], dp[now ^ 1][j - c1[i]][l1][l2] + val[i]); 33 if(l1 >= c2[i]) 34 dp[now][j][l1][l2] = max(dp[now][j][l1][l2], dp[now ^ 1][j][l1 - c2[i]][l2] + val[i]); 35 if(l2 >= 1) 36 dp[now][j][l1][l2] = max(dp[now][j][l1][l2], dp[now ^ 1][j][l1][l2 - 1] + val[i]); 37 } 38 } 39 } 40 } 41 printf("%d ", dp[now][v1][v2][k]); 42 } 43 return 0; 44 }