链接:点击打开链接
给你一个价值p,给你T1个1,T2个5,T3个10,T4个25的硬币,用这些硬币来刚好支付这个P用的最多硬币数是多少。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int i,j,k,p,t[4],dp[10100],used[10100],path[10100],num[30],a[4]={1,5,10,25};
while(~scanf("%d",&p)){
for(i=0;i<4;i++)
scanf("%d",&t[i]);
if(p==0&&t[0]==0&&t[1]==0&&t[2]==0&&t[3]==0)
break;
memset(dp,-1,sizeof(dp));
memset(num,0,sizeof(num));
dp[0]=0;
for(i=0;i<4;i++){
memset(used,0,sizeof(used));
for(j=a[i];j<=p;j++)
if(dp[j]<dp[j-a[i]]+1&&dp[j-a[i]]!=-1&&used[j-a[i]]<t[i]){
dp[j]=dp[j-a[i]]+1;
used[j]=used[j-a[i]]+1;
path[j]=j-a[i];
}
}
if(dp[p]==-1)
printf("Charlie cannot buy coffee.\n");
else{
while(dp[p]){
num[p-path[p]]++;
p=path[p];
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",num[1],num[5],num[10],num[25]);
}
}
}