标签:背包dp
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.
这题可以用多重背包,用dp[m][5]分别记录m价钱刚好能买到的物品个数的最大值,买1元,5元,10元,25元物品的个数。
#include<stdio.h> #include<string.h> #define inf 88888888 int max(int a,int b){ return a>b?a:b; } int w[10]={0,1,5,10,25},v[10]={1,1,1,1,1,1}; int dp[10006][6]; int main() { int n,m,i,j,a,b,c,d,k,ans,sum; int num[19]; while(scanf("%d%d%d%d%d",&m,&num[1],&num[2],&num[3],&num[4])!=EOF) { if(m+num[1]+num[2]+num[3]+num[4]==0)break; if(m>num[1]+num[2]*5+num[3]*10+num[4]*25){ printf("Charlie cannot buy coffee.\n");continue; } if(num[1]>=m){ printf("Throw in %d cents, 0 nickels, 0 dimes, and 0 quarters.\n",m);continue; } for(i=0;i<=m;i++){ dp[i][0]=-inf; } dp[0][0]=dp[0][1]=dp[0][2]=dp[0][3]=dp[0][4]=0; for(i=1;i<=4;i++){ ans=num[i]*w[i]; if(ans>=m){ for(j=w[i];j<=m;j++){ if(dp[j-w[i]][0]>=0){ if(dp[j-w[i]][0]+v[i]>dp[j][0]){ dp[j][0]=dp[j-w[i]][0]+v[i]; dp[j][1]=dp[j-w[i]][1];dp[j][2]=dp[j-w[i]][2];dp[j][3]=dp[j-w[i]][3];dp[j][4]=dp[j-w[i]][4]; dp[j][i]++; } } } } else{ k=1;sum=0; while(sum+k<num[i]){ sum+=k; for(j=m;j>=k*w[i];j--){ if(dp[j-k*w[i]][0]>=0){ if(dp[j-k*w[i]][0]+k*v[i]>dp[j][0]){ dp[j][0]=dp[j-k*w[i]][0]+k*v[i]; dp[j][1]=dp[j-k*w[i]][1];dp[j][2]=dp[j-k*w[i]][2];dp[j][3]=dp[j-k*w[i]][3];dp[j][4]=dp[j-k*w[i]][4]; dp[j][i]+=k; } } } k=k*2; } k=num[i]-sum; for(j=m;j>=k*w[i];j--){ if(dp[j-k*w[i]][0]>=0){ if(dp[j-k*w[i]][0]+k*v[i]>dp[j][0]){ dp[j][0]=dp[j-k*w[i]][0]+k*v[i]; dp[j][1]=dp[j-k*w[i]][1];dp[j][2]=dp[j-k*w[i]][2];dp[j][3]=dp[j-k*w[i]][3];dp[j][4]=dp[j-k*w[i]][4]; dp[j][i]+=k; } } } } } if(dp[m][0]>0) printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",dp[m][1],dp[m][2],dp[m][3],dp[m][4]); else printf("Charlie cannot buy coffee.\n"); //printf("%d\n",dp[m][0]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:背包dp
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46695591