POJ 1742 Coins 多重背包题解
2014-07-01 15:14
211 查看
本题使用二进制优化也超时了,所以要使用拖线法优化(我yy的名词,呵呵)。
就是多重背包优化。
要点:
1 在可以分解出答案的点记录剩下了多少个当前值了
2 下一个格可以根据上一个格的值判断是否是可行解。
还是看看这里的解说吧:http://www.hankcs.com/program/cpp/poj-1742-coins.html
这个博客说的非常详细了,应该适合初学者;
不过详细过头了,我快速浏览了下,然后就写自己的程序了。
就是多重背包优化。
要点:
1 在可以分解出答案的点记录剩下了多少个当前值了
2 下一个格可以根据上一个格的值判断是否是可行解。
还是看看这里的解说吧:http://www.hankcs.com/program/cpp/poj-1742-coins.html
这个博客说的非常详细了,应该适合初学者;
不过详细过头了,我快速浏览了下,然后就写自己的程序了。
#include <stdio.h> #include <memory.h> const int MAX_N = 101; const int MAX_M = 100001; int A[MAX_N]; int C[MAX_N]; int tbl[MAX_M]; int n, m; int bagDP() { memset(tbl, 0, sizeof(int) * (m+1)); for (int i = 0; i < n; i++) { if (!C[i] || !A[i]) continue; tbl[0] = C[i]+1; for (int j = 1; j <= m; j++) { if (tbl[j] >= 1) tbl[j] = C[i]+1; else if (j >= A[i] && tbl[j-A[i]] > 1) tbl[j] = tbl[j-A[i]]-1; } } int ans = 0; for (int i = 1; i <= m; i++) ans += !!tbl[i];//呵呵== if (tbl[i]) ans++; return ans; } int main() { while (scanf("%d %d", &n, &m) && (n || m)) { for (int i = 0; i < n; i++) { scanf("%d", &A[i]); } for (int i = 0; i < n; i++) { scanf("%d", &C[i]); } printf("%d\n", bagDP()); } return 0; }
相关文章推荐
- poj 1742 Coins (动态规划,背包问题)
- POJ 1742 Coins 单调队列多重背包
- POJ1742 Coins 【多重背包】
- POJ 1742 Coins 多重背包
- POJ - 1742 Coins(多重背包)@
- poj1742- Coins(多重背包)
- POJ 1742 Coins 多重背包入门题
- POJ 1742 Coins(多重背包) DP
- poj 1742 Coins(多重背包)
- POJ-1742-多重背包-Coins
- POJ 1742 Coins(多重背包可行性问题)
- (优化的有限背包) poj 1742 Coins
- POJ 1742 - Coins (dp 多重背包)
- 【POJ】1742 coins 【背包问题】
- poj 1742 coins 多重背包,只是用来标记可以组成多少个小于m的值
- poj-1742 COINS(多重背包问题)
- POJ1742 Coins(背包)
- POJ1742 Coins[多重背包可行性]
- 动态规划(背包问题):POJ 1742 Coins
- poj 1742 Coins (背包)