poj3624 0-1背包问题
2013-09-23 13:16
183 查看
问题描述:
Description POJ3624问题分析:
N 个物品每个物品有价值v[i],重量w[i], 给定背包最大承重M,求背包能够装载的最大价值。每个物品只有放入背包和不放入背包两种选择。这是典型的0-1背包问题。
定义:
f[m] : 给定背包承重m,和n件物品,背包能装载的最大价值。
推导:
f[m] = f[n - 1][m - w
] + v
第n件物品放入背包
f
[m] = f[n - 1][m] 第n件物品不放入背包
f
[m] 的子问题根据条件会有两个,子问题的选择就比较简单了,两个子问题中求值最大的就是该问题的解。而且根据对于推导式的观察,空间复杂度可以降低。O(m * n)的复杂度可以降低到O(m)。
举例:
索引 | 1 | 2 | 3 | 4 |
重量 | 1 | 2 | 3 | 2 |
价值 | 4 | 6 | 12 | 7 |
0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 4 | 4 | 4 | 4 | 4 | 4 |
0 | 4 | 6 | 10 | 10 | 10 | 10 |
0 | 4 | 6 | 12 | 16 | 18 | 22 |
0 | 4 | 7 | 12 | 16 | 19 | 23 |
#include<iostream> #include<fstream> using namespace std; static const int N = 3403; static const int M = 12881; static int f [M]; static int c , v ; //#define DEBUG int main() { #ifdef DEBUG fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt"); #endif int n, m; while (cin >> n >> m) { int i, j; for (i = 1; i <= n; i++) { cin >> c[i] >> v[i]; } memset(f, 0, sizeof f); for (i = 1; i <= n; i++) { for (j = 1; j < c[i]; j++) f[i][j] = f[i - 1][j]; for(j = c[i]; j <= m; j++) /* j's domain */ { if (f[i - 1][j] < f[i - 1][j - c[i]] + v[i]) f[i][j] = f[i - 1][j - c[i]] + v[i]; else f[i][j] = f[i - 1][j]; } } cout << f [m] << "\n"; } return 0; }
POJ3624 以上代码内存超限,待优化。
代码的时间上限是O(nm), 对于每个物品i, 它所要遍历的整数区间都是[ci, m]
优化代码如下,理解递推过程后优化就很简单了。
#include<iostream> #include<fstream> using namespace std; static const int N = 3403; static const int M = 12881; static int f[M]; static int c , v ; //#define DEBUG int main() { #ifdef DEBUG fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt"); #endif int n, m; while (cin >> n >> m) { int i, j; for (i = 1; i <= n; i++) { cin >> c[i] >> v[i]; } memset(f, 0, sizeof f); for (i = 1; i <= n; i++) { for(j = m; j >= c[i]; j--) /* j's domain */ { if (f[j] < f[j - c[i]] + v[i]) f[j] = f[j - c[i]] + v[i]; } } cout << f[m] << "\n"; } return 0; }
空间复杂度由O(N*V)减少到O(V)
相关文章推荐
- POJ3624 0-1 背包问题
- poj 1742 Coins (动态规划,背包问题)
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- 背包问题(天平)——POJ 1837
- POJ 1742 Coins 混合三种背包问题
- POJ 1837:Balance:动态规划_背包问题变形
- POJ 1837 天平平衡问题 类似背包问题
- poj 3459(背包问题)
- poj 1742 Coins【多重背包可行性问题】
- poj 1837 0-1背包问题
- POJ 3624 /背包问题
- POJ_1014 Dividing(多重背包问题)
- POJ1276 Cash Machine(多重背包问题)
- (水)POJ-3262 贪心,背包,比率问题
- POJ 3132 Sum of Different Primes ( 满背包问题)
- 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】
- poj 2063 完全背包问题
- POJ 1384 && HDU 1114 Piggy-Bank(完全背包问题)
- poj 3181 Dollar Dayz 钱币兑换问题 大数/高精度 完全背包
- POJ_2063_背包问题