您的位置:首页 > 其它

poj 1787 多重背包 记录路径

2013-04-14 20:41 330 查看
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 10100
using namespace std;
int dp
;
int used
;
int path
;
int num[30];
int main(){
int b[10];
int P,c1,c2,c3,c4;
int a[10];
while(scanf("%d",&P)!=EOF,P){
for(int i=1;i<=4;i++)
cin>>b[i];
memset(dp,-1,sizeof(dp));
dp[0]=0;
a[1]=1;
a[2]=5;
a[3]=10;
a[4]=25;
for(int i=1;i<=4;i++){
memset(used,0,sizeof(used));
for(int j=a[i];j<=P;j++)
if(dp[j-a[i]]+1>dp[j]&&dp[j-a[i]]!=-1&&used[j-a[i]]<b[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{
memset(num,0,sizeof(num));
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]);

}

}
return 0;
}

//路径是如何记录的
//题意求最多硬币数
//多重背包不用压缩。最常见题意,初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: