POJ 1276 取款机零钱组合问题 动态规划
2011-12-23 13:04
267 查看
本题为多重背包问题,即每种零钱的个数是有限个,求不超过目标钱数的可以组合出的最大钱数
采用DP的思想,先对目标钱数以内的所有面额做逆向遍历,初始dp[0] = true,即0元可凑出
在此基础上如果当前的stat可以凑出,那么继续组合出更大的钱数,记下当前有限个零钱和前面的
零钱一起可以凑出的不超过目标钱数的所有合法的值。最后从money逆向打印记下的最大的值即可
Source Code
采用DP的思想,先对目标钱数以内的所有面额做逆向遍历,初始dp[0] = true,即0元可凑出
在此基础上如果当前的stat可以凑出,那么继续组合出更大的钱数,记下当前有限个零钱和前面的
零钱一起可以凑出的不超过目标钱数的所有合法的值。最后从money逆向打印记下的最大的值即可
Source Code
Problem: 1276 | User: yangliuACMer | |
Memory: 640K | Time: 516MS | |
Language: C++ | Result: Accepted |
#include <iostream> using namespace std; int main(){ int v[1001],n[1001]; int m,money,i,j,stat; int dp[100001]; while(cin>>money>>m){ memset(dp, 0, sizeof(dp)); for(i = 0; i < m; i++){ cin>>n[i]>>v[i]; } dp[0] = true; for(i = 0; i < m; i++){ for(stat = money; stat >=0; stat--){ if(dp[stat]){//如果当前的stat可以凑出,那么继续组合出更大的钱数 for(j=1; j<=n[i]; j++) { if((stat+v[i]*j) > money) break; //超过面额跳出循环 dp[stat+v[i]*j]=true; //说明当前的stat+v[i]*j值可以凑出 } } } } for(stat = money; stat >= 0; stat--){ if(dp[stat]){ cout<<stat<<endl;//逆方向遍历,找最近的可以凑出的钱数 break; } } } return 0; }
相关文章推荐
- POJ 1276 取款机零钱组合问题 动态规划
- POJ 1276 Cash Machine -- 动态规划(背包问题)
- POJ 1276 Cash Machine -- 动态规划(背包问题)
- POJ——1276(动态规划,硬币问题)
- poj 1276 Cash Machine(多重背包问题)
- 【动态规划】换零钱问题用一维动态规划解决,没有数量限制可以用一维
- POJ 1276 多重背包问题
- 动态规划 背包问题 poj 1837 Balance
- POJ-1276-Cash-Machine 二进制优化多重背包问题
- AC解 - 用动态规划解决一道排列组合计数问题(序关系计算)
- 2011.12月初 背包问题专辑POJ 3624 1276 2392 1837
- POJ 1276 二进制优化的多重背包问题
- POJ-1276 Cash Machine(多重背包问题)
- 【动态规划】 POJ1088 滑雪问题
- 动态规划——找零钱问题
- poj 3783 Balls 动态规划 100层楼投鸡蛋问题
- 0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276
- POJ 1015 公正陪审团问题 动态规划
- 【动态规划/多重背包问题】POJ1014-Dividing
- 动态规划解决找零钱问题