标签:des style blog http ar io color os sp
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 3176 | Accepted: 913 |
Description
Input
Output
Sample Input
12 5 3 1 2 16 0 0 0 1 0 0 0 0 0
Sample Output
Throw in 2 cents, 2 nickels, 0 dimes, and 0 quarters. Charlie cannot buy coffee.
题意:给定一个数p,要求用四种币值为1,5,10,25的硬币拼成p,并且硬币数要最多,如果无解输出"Charlie cannot buy coffee.",1<=p<=1万,1<=硬币数量<=1万
思路:完全背包+路径记忆。
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; int v[4]= {1,5,10,25}; int dp[10010]; int path[10010],used[10010]; int num[4]; int ans[100];//这个要大于25 int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int P; while(scanf("%d%d%d%d%d",&P,&num[0],&num[1],&num[2],&num[3]),(P+num[0]+num[1]+num[2]+num[3])) { for(int i=0; i<=P; i++)dp[i]=-INF; memset(path,0,sizeof(path)); path[0]=-1;//退出的条件 dp[0]=0; for(int i=0; i<4; i++) { memset(used,0,sizeof(used)); for(int j=v[i]; j<=P; j++) { if(dp[j-v[i]]+1>dp[j]&&dp[j-v[i]]>=0&&used[j-v[i]]<num[i]) { //dp[j]存j里用多少枚硬币换。(要多的);used来记录是否超过数量 dp[j]=dp[j-v[i]]+1;//压入dp, used[j]=used[j-v[i]]+1;//体积j,里数量加一 path[j]=j-v[i];//记录上一个路径(体积) } // printf("dp[%d]=%d \t used[%d]=%d\tpath[%d]=%d\n",j,dp[j],j,used[j],j,path[j]); } } if(dp[P]<0) { printf("Charlie cannot buy coffee.\n"); continue; } memset(ans,0,sizeof(ans)); int i=P; while(1) { if(path[i]==-1)break; ans[i-path[i]]++; i=path[i]; } printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",ans[v[0]],ans[v[1]],ans[v[2]],ans[v[3]]); } return 0; } /* 12 5 3 1 2 16 0 0 0 1 0 0 0 0 0 */
不懂看看测试数据;
是不是很清楚了。。哈哈。
标签:des style blog http ar io color os sp
原文地址:http://www.cnblogs.com/yuyixingkong/p/4170567.html