1 for(int i=1; i<=m; i++) //物品 2 for(int j=W; j>=0; j--) //容量 3 { 4 if(j >= w[i]) 5 dp[i][j] = max(dp[i-1][j-w[i]]+val[i], dp[i-1][j]); 6 else //只是为了好理解 7 dp[i][j] = dp[i-1][j]; 8 }
1 for(int i=1; i<=n; i++) 2 for(int j=w[i]; j<=W; j++)//注意此处,与0-1背包不同,这里为顺序,0-1背包为逆序 3 f[j]=max(f[j],f[j-w[i]]+c[i]);
例题:POJ2229
题意:
找一些2^x(0<=x),使它们的和为N。比如,N=7:
1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4
(1 <= N <= 1,000,000).
解法:直接完全背包即可,注意关系式更新的时候为“拿”的情况加上“不拿”的情况;注意初始化dp[0]=1
1 int N; 2 int num[25]; 3 int dp[1000000 + 5]; 4 int main() { 5 // freopen("input.txt", "r", stdin); 6 scanf("%d", &N); 7 num[1] = 1; 8 dp[0] = 1; 9 for (int i = 2; i <= 25; i++) num[i] = num[i - 1] * 2; 10 for (int i = 1; i <= 21; i++) { 11 for (int j = num[i]; j <= N; j++) { 12 dp[j] = (dp[j] + dp[j - num[i]]) % MOD; 13 } 14 } 15 printf("%d\n", dp[N]); 16 return 0; 17 }
原文:https://www.cnblogs.com/romaLzhih/p/11415141.html