poj 1787 记录路径的多重背包
来源:互联网 发布:数据科学与r语言 编辑:程序博客网 时间:2024/04/30 18:05
如题:http://poj.org/problem?id=1787
Description
Your program will be given numbers and types of coins Charlie has and the coffee price. The coffee vending machines accept coins of values 1, 5, 10, and 25 cents. The program should output which coins Charlie has to use paying the coffee so that he uses as many coins as possible. Because Charlie really does not want any change back he wants to pay the price exactly.
Input
Output
Sample Input
12 5 3 1 216 0 0 0 10 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价值的硬币拼出总钱数,并要求硬币尽量用的多。
一开始没注意到硬币的要求,将硬币价值作为价值w进行背包,wa了好久
关于记录路径,只要在背包的同时,记录这一层是由那一层过来的就行,并同时记录上一层要多少个硬币才能变为这一层,至于哪一种,就可以用int t=(n-path[n])/count[n];推出。
还有要注意的是背包策略,f[j]并不是在一定金额中尽量多放硬币,f[j]代表的是满足拼成j金额能放硬币的最多数量f[j]=max(f[j-k*c]+k) ,初始化f数组为-inf。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num[5];
int n;
int w[5]={0,1,5,10,25};
int f[10005];
int path[10005];
int count[10005];
void ZeroOnePack(int k,int c)
{
int j;
for(j=n;j>=k*c;j--)
{
if(f[j-k*c]+k>f[j])
{
f[j]=f[j-k*c]+k;
path[j]=j-k*c;
count[j]=k;
}
}
}
void CompletePack(int c)
{
int j;
for(j=c;j<=n;j++)
{
int tv=f[j];
if(f[j-c]+1>f[j])
{
f[j]=f[j-c]+1;
path[j]=j-c;
count[j]=1;
}
}
}
void MultiplePack(int c,int cnt)
{
if(c*cnt>=n)
{
CompletePack(c);
return;
}
int k=1;
while(k<cnt)
{
ZeroOnePack(k,c);
cnt-=k;
k*=2;
}
ZeroOnePack(cnt,c);
}
int main()
{
//freopen("C:\\1.txt","r",stdin);
//freopen("C:\\3.txt","w",stdout);
while(~scanf("%d%d%d%d%d",&n,&num[1],&num[2],&num[3],&num[4])
&&(n||num[1]||num[2]||num[3]||num[4]))
{
// printf("%d %d %d %d %d\n",n,num[1],num[2],num[3],num[4]);
memset(f,0,sizeof(f));
memset(path,0,sizeof(path));
memset(count,0,sizeof(count));
int i;
for(i=1;i<=n;i++)
f[i]=-10005;
for(i=1;i<=4;i++)
MultiplePack(w[i],num[i]);
if(f[n]<=0)
printf("Charlie cannot buy coffee.\n");
else
{
int c1=0,c2=0,c3=0,c4=0;
while(n)
{
int t=(n-path[n])/count[n];
if(t==1)
c1+=count[n];
else if(t==5)
c2+=count[n];
else if(t==10)
c3+=count[n];
else
c4+=count[n];
n=path[n];
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",c1,c2,c3,c4);
}
}
return 0;
}
- poj 1787 记录路径的多重背包
- poj 1787 多重背包+路径记录
- poj 1787 多重背包 记录路径
- poj 1787 多重背包记录路径
- POJ 1787 Charlie's Change 记录路径的多重背包
- POJ 1787 Charlie's Change(多重背包+记录路径)
- poj 1787 Charlie's Change【多重背包可行性+记录路径】
- poj 1787 Charlie's Change(完全背包 或 多重背包 记录路径)
- 动态规划,多重背包,保存路径,用完全背包的方法做多重背包(Charlie's Change,poj 1787)
- Poj 1787 Charlie's Change(多重背包 或者 记录的完全背包)
- POJ1787:Charlie's Change(记录路径的多重背包)
- POJ 1787(完全背包+记录路径)
- 01背包、完全背包、多重背包问题的C++实现及路径记录
- poj 1787 Charlie's Change(打印路径的多重背包 ->交易数量最大化)
- POJ-1787 Charlie's Change( 多重背包记录方案)
- POJ_1787_Charlie'sChange(多重背包&&记录路径)
- poj 1787(多重背包)
- POJ 1787 - Charlie's Change(完全背包+路径记录)
- 使用Python正则表达式RE从CSDN博客源代码中匹配出博客信息
- Devexpress gridcontrol checkbox不能多选问题
- 注释代码快捷键:
- two sum
- 北京治疗老年癫痫病医院-【癫痫专科医院】
- poj 1787 记录路径的多重背包
- C++嵌套类的使用
- 录像脑电图费用_名医养生-淮安特色技术专题
- java学习过程中的异常处理方式
- 怎么解决癫痫病人的心理问题
- mysql事务处理(transcation)
- 打印1到最大的N位数
- USACO3.1.2 Score Inflation (inflate)
- linux 程序、动态库、静态库内部添加版本号和编译时间