9.3.1 多阶段决策问题
- 9.4 物品无限的背包问题
无权变成有权,本质上背包问题就是有向带权图,即DAG + weighted.
- 9.5 0-1 背包问题
c
for(int i = n; i >=1 ; i--) for(int j = 1; j <= n; j++) { dp[i][j] = i == n ? 0 : dp[i+1][j]; if(j >= V[i]) dp[i][j] = max(dp[i][j], dp[i+1][j-V[i]] + W[i]); }
9.3.2 规划方向
- 下面这种dp有利于不存边,进而扩展到滚动数组.
- 边界方面,i=0时为0,j<0时为负无穷,最终答案为f(n,C).
c
for(int i = 1; i <=n ;i++) for(int j = 0; j <= C; j++) { f[i][j] = (i == 1 ? 0 : f[i-1][j]); if(j >= V[i]) f[i][j] = max(f[i][j], f[i-1][j-V[i]] + W[i]); }
9.3.3 滚动数组
把f变为一维数组,本质上还是那么理解,只是之前的元素还没有被覆盖
c
memset(f, 0, sizeof(f)); for(int i = 1; i <= n; i++) { scanf("%d%d", &V, &W); for(int j = C; j >= 0; j--) if(j >= V) f[j] = max(f[j], f[j-V] + W); }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。