POJ - 1787 Charlie's Change (揹包+記錄路徑)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<stack>
#define ll long long
using namespace std;
struct node
{
    int sum;//錢幣總數
    int c[5];//每種錢幣已取數量
} dp[10010];
int price[10]= {0,1,5,10,25},c[10];
int p;
int main()
{
    while(~scanf("%d%d%d%d%d",&p,&c[1],&c[2],&c[3],&c[4]))
    {
        if(p+c[1]+c[2]+c[3]+c[4]==0)break;
        memset( dp,-1,sizeof dp);
        dp[0].sum=dp[0].c[1]=dp[0].c[2]=dp[0].c[3]=dp[0].c[4]=0;
        for(int i=1; i<=4; i++)
            for(int j=price[i]; j<=p; j++)
            {
                if(dp[j-price[i]].sum!=-1)
                    if(dp[j].sum<dp[j-price[i]].sum+1&&dp[j-price[i]].c[i]<c[i])
                    {
                        dp[j]=dp[j-price[i]];
                        dp[j].sum++;
                        dp[j].c[i]++;
                    }
            }
        if(dp[p].sum>0)
            printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",dp[p].c[1],dp[p].c[2],dp[p].c[3],dp[p].c[4]);
        else
            printf("Charlie cannot buy coffee.\n");
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章