(多重背包+记录路径)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& ...
随机推荐
- 分布式管理系统-git安装及配置
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 安装完成后,还需要最后一步设置,在命令行输入: $ git config - ...
- I/O流——其他流
其他流 一.ObjectInputStream/ObjectOutputStream ① ObjectInputStream和ObjectOutputStream分别与FileInputStream和 ...
- C#读写XML
1.根据xml格式的string生成xml文件并保存到本地 /// <summary> /// 保存XML到磁盘 /// </summary> /// <param na ...
- C#实现JSON序列化与反序列化
1.使用 JavaScriptSerializer类实现序列化 namespace: System.Web.Script.Serialization eg: // 序列化 private string ...
- PTA Strongly Connected Components
Write a program to find the strongly connected components in a digraph. Format of functions: void St ...
- font-family 字体
宋体 SimSun黑体 SimHei微软雅黑 Microsoft YaHei微软正黑体 Microsoft JhengHei新宋体 NSimSun新细明体 PMingLiU细明体 MingLiU标楷体 ...
- bootstrop验证手机号
formValidate($form,getRules(),getMessages()); function getRules(){ return { "memberViewVo.membe ...
- Visual Studio 2010 插件之Resharper
这一系列不是对每个功能的中文帮助,而是我对开发中可能涉及的功能需求,利用Resharper来完成.有些是Visual Studio有的,但是做的不好,有些是没有而Resharper发明的.总的目的都只 ...
- 微信web开发者工具初探
最近需要在微信企业号中挂接网页,之前也没有接触过微信开发,刚开始也不知道怎么调试,后来同事介绍使用“微信web开发者工具”,于是在网上下了一个,使用了一下的确很好用.它不仅支持Android和IOS同 ...
- Cad 二次开发关于SelectCrossingPolygon和SelectFence返回结果Status为error的小测试
CAD2008的二次开发,有个很奇怪的现象,只要你选择的点集不在当前视图上SelectCrossingPolygon和SelectFence返回结果Status就会为error,所以要获取正确的结果, ...