标签:can sam using bec contains mil where memory ==
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 5731 Accepted: 1849
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.
题意:有1,5,10,25元硬币各C1, C2, C3, C4个,求正好可以买一杯价值P元的咖啡需要的最多的硬币数,输出每种硬币个数。
题解:完全背包+记录路径。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=10005,inf=0x3f3f3f3f;
int num[5],cnt[maxn],w[5]={0,1,5,10,25},dp[maxn],path[maxn],ans[30];
int main()
{
int i,j,P;
while(scanf("%d%d%d%d%d",&P,&num[1],&num[2],&num[3],&num[4]))
{
if(P+num[1]+num[2]+num[3]+num[4]==0) break;
{
fill(dp,dp+maxn,-inf);
fill(path,path+maxn,-1);
fill(ans,ans+30,0);
dp[0]=0;
}
for(i=1;i<=4;i++)
{
fill(cnt,cnt+maxn,0);
for(j=w[i];j<=P;j++)
if(dp[j-w[i]]+1>dp[j]&&cnt[j-w[i]]+1<=num[i])
{
dp[j]=dp[j-w[i]]+1;
cnt[j]=cnt[j-w[i]]+1;
path[j]=w[i];
}
}
if(dp[P]<0) printf("Charlie cannot buy coffee.\n");
else
{
i=P;
while(i>0)
ans[path[i]]++,i-=path[i];
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",ans[1],ans[5],ans[10],ans[25]);
}
}
return 0;
}
标签:can sam using bec contains mil where memory ==
原文地址:https://www.cnblogs.com/VividBinGo/p/11366841.html