转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
乍一看是多重背包问题,由于需要记录每种物品的个数。
既然每次在转移状态的时候知道每种物品的个数,便可以根据完全背包来做,这样效率将大大提高,代码也简洁。
num[i][j]表示总数为j的时候,i种硬币的个数
dp[j]表示总数为j的时候,最多的总硬币个数
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<string>
#include<vector>
#define eps 1e-6
#define LL long long
#define LD long double
#define pi acos(-1.0)
#define inf 1<<30
using namespace std;
int m,cnt[4],cost[4]={1,5,10,25},num[4][10005],dp[10005];
int main(){
while(scanf("%d%d%d%d%d",&m,&cnt[0],&cnt[1],&cnt[2],&cnt[3])!=EOF&&m+cnt[0]+cnt[1]+cnt[2]+cnt[3]){
for(int i=1;i<=m;i++)
dp[i]=-1;
dp[0]=0;
memset(num,0,sizeof(num));
for(int i=0;i<4;i++)
for(int k=cost[i];k<=m;k++)
if(dp[k-cost[i]]!=-1&&dp[k]<dp[k-cost[i]]+1&&num[i][k-cost[i]]+1<=cnt[i]){
dp[k]=dp[k-cost[i]]+1;
num[i][k]=num[i][k-cost[i]]+1;
for(int r=0;r<i;r++)
num[r][k]=num[r][k-cost[i]];
}
if(dp[m]!=-1)
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",num[0][m],num[1][m],num[2][m],num[3][m]);
else
printf("Charlie cannot buy coffee.\n");
}
return 0;
}
分享到:
相关推荐
经典的0-1背包问题. 适合新手学习. 原题网址:http://poj.grids.cn/problem?id=2773
POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
判定性背包问题 带附属关系的背包问题 <5> + -1背包问题 双背包求最优值 构造三角形问题 带上下界限制的背包问题(012背包) 3.线性的动态规划问题 积木游戏问题 决斗(判定性问题) 圆的最大多边形问题 ...
poj 1353 Color Change of Go Game Pieces.md
放炮问题,北大网站 POJ 1185 算法
北大POJ2262-Goldbach's Conjecture 解题报告+AC代码
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ1321棋盘问题 很好两种解法很值得去参考一下 完整的实验报告还有代码希望kan
北大POJ2388-Who's in the Middle 解题报告+AC代码
北大poj1012-Joseph【经典约瑟夫问题】 poj1012-Joseph【经典约瑟夫问题】
动态规划 01背包问题 POJ3624可以AC
北大POJ2488-A Knight's Journey 解题报告+AC代码
POJ1048,加强版的约瑟夫问题 难度中等
POJ 1328 java做!雷达问题!java版本!AC答案~
北大POJ1004-Financial Management 解题报告+AC代码
POJ2528-Mayor's posters 测试数据。数据来源:Alberta Collegiate Programming Contest 2003.10.18 – 问题G
poj分类poj分类poj分类poj分类
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
晒代码之二——多重背包(POJ1276)