(多重背包+记录路径)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& ...
随机推荐
- Redis学习笔记-进阶
Redis持久化方案 redis有rdb和aof两种持久化方案 1)rdb方式 当符合一定条件时会自动将内存中的所有数据执行快照操作并存储到硬盘上 默认存储在redis根目录的dump.rdb文件中, ...
- 关于AFNetworking菊花转圈圈的问题
刚开始接触AFN的时候,发现菊花老是不转,百度到大神的博客上,说AFN里面的API的网络加载菊花默认是关闭的(才发现默认情况下AFN的转圈圈的菊花是关闭的)需要手动打开才能够显示转圈圈,打开的方法是: ...
- SeekBar 圆角问题
用图片做背景色,最后处理成.9.png的.用普通png图片做背景,则两边会有圆角出现,原因是图片不适合SeekBar尺寸,因而被拉伸或压缩,从而产生圆角. <?xml version=" ...
- Palindrome Pairs
Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that t ...
- 开启gpu加速的高性能移动端相框组件!
通过设置新的css3新属性translateX来代替传统的绝对定位改变left值的动画原理,新属性translateX会开启浏览器自带的gpu硬件加速动画性能,提高流畅度从而提高用户体验, 代码有很详 ...
- swift 之 闭包
一.闭包 格式:{ ( 参数名:类型, 参数名:类型 .. ) in 内容体 return 返回值 } 最完整的闭包 1.省略参数类型 { ( 参数名, 参数名.. ) ...
- c++模板使用出错情况error LNK2019: unresolved external symbol "public: float __thiscall Compare<float>::min(void)" (?min@?$Compare@M@@QAEMXZ) referenced in function _main
将类模板在头文件中定义,类的成员函数在头文件中声明,头文件中只留下接口,函数的实现在另一个.cpp文件中,这样编译出来错误error LNK2019: unresolved external symb ...
- 转js中this指向的简明解答
JS中的this对象详解 JS中this关键字很常见,但是它似乎变幻莫测,让人抓狂.这篇文章就来揭示其中的奥秘. 借助阮一峰老师的话:它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用. ...
- js替换选中的文字
替换html中选中的文字 function replaceSelection() { if (window.getSelection) { var selecter = window.getSelec ...
- 1.jenkins持续集成-jenkins安装
1.为什们要使用jenkins Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目; 2.监控外部调用执行的工作. 2.安装jen ...