(多重背包+记录路径)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& ...
随机推荐
- Maven Archetype
1. 从project创建archetype 在项目根目录下,运行 mvn archetype:create-from-project 创建的archetype工程在app_folder/target ...
- java工程笔记
start.sh #TITLE=jetty DEPLOY_PATH=$(cd $()/../ && pwd) export DEPLOY_PATH CLASSPATH=${CLASSP ...
- 全球首个全流程跨平台界面开发套件,PowerUI分析
一. 首个全流程跨平台界面开发套件,PowerUI正式发布 UIPower在DirectUI的基础上,自主研发全球首个全流程跨平台界面开发套件PowerUI(PUI)正式发布,PowerU ...
- ios面试技巧
一.软件开发流程? 软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法.软件的总体结构设计和模块设计.编程和调试.程序联调和测试以及编写.提交程序. 1 相关系统分析员和用户初步了解需 ...
- 第11章 .NET Remoting
11.1理解remoting 11.1.1应用程序域基本概念 .NET提供了一项技术,使得跨应用程序域中的对象也可以相互访问,该技术就是.NET remoting.(185) 11.1.2应用程序域的 ...
- linux 程序管理与SElinux
此文涉及的命令:&.jobs.fg.bg.kill.nohup.ps.top.pstree.free.uname.uptime.netstat.dmesg.vmstat.fuser.lsof. ...
- C#中的?和??的用法
1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型也 ...
- RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机HA
环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterprise ...
- ubuntu 15 安装cuda,开启GPU加速
1 首先要开启GPU加速就要安装cuda.安装cuda,首先要安装英伟达的驱动.ubuntu有自带的开源驱动,首先要禁用nouveau.这儿要注意,虚拟机不能安装ubuntu驱动.VMWare下显卡只 ...
- asp.net web api集成微信服务(使用Senparc微信SDK)
/// <summary> /// 微信请求转发控制器 /// </summary> [RoutePrefix("weixin")] public clas ...