(多重背包+记录路径)Charlie's Change (poj 1787)
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.
12 5 3 1 2
16 0 0 0 1
0 0 0 0 0
样例输出
Throw in 2 cents, 2 nickels, 0 dimes, and 0 quarters.
Charlie cannot buy coffee.
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f; #define met(a,b) (memset(a,b,sizeof(a)))
#define N 11000
#define INF 0x3f3f3f3f int pre[N], v[]={,,,,}, dp[N];
int used[N]; /** dp[i] 代表组成i元时需要的最多的硬币
used[i] 代表第i种硬币用了几次(感觉这点很好,能将多重背包转化为完全背包)
pre[j] 记录的是j从哪个状态转化过来的 */ int main()
{
int p, num[]={}; while(scanf("%d%d%d%d%d", &p, &num[], &num[], &num[], &num[]), p+num[]+num[]+num[]+num[])
{
int i, j, ans[]={}; met(dp, -);
met(pre, -);
dp[] = ;
for(i=; i<=; i++)
{
memset(used, , sizeof(used));
for(j=v[i]; j<=p; j++)
{
if(dp[j-v[i]]+>dp[j] && dp[j-v[i]]>= && used[j-v[i]]<num[i])
{
dp[j] = dp[j-v[i]]+;
used[j] = used[j-v[i]]+;
pre[j] = j-v[i];
}
}
} if(dp[p]<)
printf("Charlie cannot buy coffee.\n");
else
{
met(ans, );
i = p;
while()
{
if(pre[i]==-) break;
ans[i-pre[i]]++;
i = pre[i];
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n", ans[v[]], ans[v[]], ans[v[]], ans[v[]]);
} }
return ;
}
另一种解法:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm> using namespace std;
#define met(a,b) (memset(a,b,sizeof(a)))
const int N=;
int dp[N], v[]={,,,,};
int num[N][];
//dp[j]为咖啡的价格为j时,所能花费的最多钱币数
//num[j][i],表示咖啡的价格为j时,花费的第i种货币的个数
int main()
{
int a[], p; while(scanf("%d%d%d%d%d", &p, &a[], &a[], &a[], &a[]), p+a[]+a[]+a[]+a[])
{
int i, j, k; met(dp, -);
met(num, ); dp[] = ;
for(i=; i<=; i++)
{
for(j=v[i]; j<=p; j++)
{
if(dp[j-v[i]]>= && dp[j-v[i]]+>dp[j] && num[j-v[i]][i]<a[i])
{
dp[j] = dp[j-v[i]] + ;
for(k=; k<=; k++)
{
if(k==i)
num[j][k] = num[j-v[i]][k]+;
else
num[j][k] = num[j-v[i]][k];
}
}
}
} if(dp[p]==-)
printf("Charlie cannot buy coffee.\n");
else
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n", num[p][], num[p][], num[p][], num[p][]);
}
return ;
}
(多重背包+记录路径)Charlie's Change (poj 1787)的更多相关文章
- Charlie's Change POJ - 1787
Time limit 1000 ms Memory limit 30000 kB description Charlie is a driver of Advanced Cargo Movement, ...
- poj1787Charlie's Change(多重背包+记录路径+好题)
Charlie's Change Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3720 Accepted: 1125 ...
- 01背包记录路径 (例题 L3-001 凑零钱 (30分))
题意: 就是找出来一个字典序最小的硬币集合,且这个硬币集合里面所有硬币的值的和等于题目中的M 题解: 01背包加一下记录路径,如果1硬币不止一个,那我们也不采用多重背包的方式,把每一个1硬币当成一个独 ...
- Charlie's Change(完全背包记录路径)
Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...
- poj 1787 背包+记录路径
http://poj.org/problem?id=1787 Charlie's Change Time Limit: 1000MS Memory Limit: 30000K Total Subm ...
- 完全背包记录路径poj1787 好题
这题有点多重背包的感觉,但还是用完全背包解决,dp[j]表示凑到j元钱时的最大硬币数,pre[j]是前驱,used[j]是凑到j时第i种硬币的用量 △回溯答案时i-pre[i]就是硬币价值 #incl ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- 牛客网暑期ACM多校训练营(第三场) A PACM Team 01背包 记录路径
链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 Eddy was a contestant participating in ACM ICPC ...
- UVA 624(01背包记录路径)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- 抽象和封装_JAVA_OOP
很久没做笔记了,没有以前的刚开始学习软件时候的热情了.包括几年前U盘损坏,数据丢失,通过数据恢复,也只是找回一些零星的碎片. 现在就抽时间把以前的技术笔记找回来,这十条记录在电脑上显示的最后修改日期为 ...
- git 记住密码
http://yourname:password@git.oschina.net/name/project.git
- OpenLDAP,一登录系统就修改密码
http://guodayong.blog.51cto.com/263451/d-2 郭大勇的博客 1:修改配置文件 在前面打开注释 moduleload ppolicy.la modulepat ...
- Android开发学习---sharedpreference的使用
在前面文章中,为了使数据回显,使用的技术思路是,首先,将数据持久化写到ROM或者SDCard中,其中name和password以":"分隔;然后,将数据记取出来,再用split方法 ...
- VS2010+C#+AutoCAD2008时断点调试功能无效的处理方法
把acad.exe.config文件修改为:------------------------------------------------------------------------------ ...
- sendto频率过快导致发送丢包
编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络环境:1000M,直连,多网卡 系统:Linux ver ...
- 【随笔】js加载
有时候,当发现js操作一个dom的时候,发现dom没有找到,这是由于html没有加载完就开始操作该dom的缘故,所以需要在html文档加载完后再加载js,于是我们可以这么做: js方法:window. ...
- Linux学习(一):从图形界面进入命令行及命令行进入图形界面
一.从图形界面进入命令行 最近脑洞大开,想接触一下linux.本人设备是win7,于是安了VMware(12.0.0)虚拟机,在安Linux(我用的CentOS 6.3 64)时不太会搞,跟据提示(英 ...
- 面试题<初级>
INTERVIEW .markdown-body ul pre code { background:red; font-size:40px; } @code-char:"```" ...
- [转]protobuf-2.5.0.tar.gz的下载与安装
protobuf-2.5.0.tar.gz的下载与安装 原文地址:http://blog.csdn.net/tdmyl/article/details/31811317 版权声明:本文为博主原创文章, ...