网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以。

自己做的时候,还没了解过多重背包,该题直接往完全背包思考了。
咖啡的钱看作总的背包容量,1、5、10、25分别代表四种物品的重量,可以取多次,但是有限制数量。
设dp[j]为咖啡的价格为j时,所能花费的最多钱币数
此外建立一个二维数组num[j][i],表示咖啡的价格为j时,花费的第i种货币的个数

状态转移方程:
dp[j]=max(dp[j],dp[j-v[i]]+1)
初始条件:dp[j]=-1,dp[0]=0;
num[j][i]=0;
若dp[j-v[i]]+1>dp[j],则
num[j][i]=num[j-v[i]]+1; 当然有个限制条件:num[j-v[i]]+1<=c[i]
num[j][k]=num[j-v[k]]; (k!=i)

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn=;
int dp[maxn]; //dp[j]为咖啡的价格为j时,所能花费的最多钱币数
int V;
int c[]; //四种货币的限制个数
int v[]={,,,};
int num[maxn][]={}; //num[j][i],表示咖啡的价格为j时,花费的第i种货币的个数
int main()
{
while(scanf("%d%d%d%d%d",&V,&c[],&c[],&c[],&c[])!=EOF){
if(c[]==&&c[]==&&c[]==&&c[]==&&V==){
break;
}
dp[]=;
memset(dp,-,sizeof(dp));
memset(num,,sizeof(num));
dp[]=;
for(int i=;i<;i++){
for(int j=v[i];j<=V;j++){
//这里要注意dp[j-v[i]]得可到达
if(dp[j-v[i]]!=- && dp[j-v[i]]+>dp[j]&&num[j-v[i]][i]<c[i]){
dp[j]=dp[j-v[i]]+;
for(int 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[V]==-)
printf("Charlie cannot buy coffee.\n");
else
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",num[V][],num[V][],num[V][],num[V][]);
}
return ;
}

POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)的更多相关文章

  1. poj 1787 Charlie's Change (多重背包可作完全背包)

    Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3792   Accepted: 1144 ...

  2. [POJ 1787]Charlie's Change (动态规划)

    题目链接:http://poj.org/problem?id=1787 题意:有4种货币分别是1元,5元,10元,20元.现在告诉你这四种货币分别有多少个,问你正好凑出P元钱最多可以用多少货币.每种货 ...

  3. poj 1787 Charlie's Change

    // 题意 给定一个数p,要求用四种币值为1,5,10,25的硬币拼成p,并且硬币数要最多,如果无解输出"Charlie cannot buy coffee.",1<=p&l ...

  4. dp--01背包,完全背包,多重背包

    背包问题 以下代码 n是物品个数,m是背包容积 物品价值和重量int v[maxn],w[maxn]; 01背包 模板 for(int i = 0; i < n; i++) { for(int ...

  5. POJ 1787 Charlie&#39;s Change

    多重背包 可行性+路径记录 题意是说你要用很多其它的零钱去买咖啡.最后输出你分别要用的 1,5 ,10 .25 的钱的数量. 多重背包二进制分解.然后记录下 这个状态.最后逆向推就可以. #inclu ...

  6. (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)

    http://poj.org/problem?id=3260   Description Farmer John has gone to town to buy some farm supplies. ...

  7. POJ 3260 The Fewest Coins(完全背包+多重背包=混合背包)

    题目代号:POJ 3260 题目链接:http://poj.org/problem?id=3260 The Fewest Coins Time Limit: 2000MS Memory Limit: ...

  8. POJ 3260 完全背包+多重背包+思维

    传送门:https://vjudge.net/problem/20465/origin 题意:你有n种钞票,面值为c[i],数量为v[i],便利店老板有无数张面值为c[i]的钞票,问你买一个价值为T的 ...

  9. POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)

    题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬 ...

随机推荐

  1. 对云风 cstring 第二次解析

    前言 从明天起 关心粮食和蔬菜 我有一所房子 面朝大海 春暖花开 本文前提条件 1.了解 posix 线程 2.了解 原子操作 3.具备简单C基础,或者 你也敲一遍. 如果上面不太清楚,你可以翻看我以 ...

  2. IIS 配置错误解决方法集合

    问题:405 - 不允许用于访问此页的 HTTP 谓词 解决:IIS处理程序映射中添加模块映射,模块选择:ServerSideIncludeModule,名称:SSINC-HTML

  3. JavaScript高级程序设计之EventUtil

    简单的通用事件方法 var EventUtil = { getEvent: function (e) { return e || window.event; }, getTarget: functio ...

  4. ios多线程的几种创建方式以及基本使用

    1.第一种,NSThread方法,此方法使用很少! 2.NSOperation,面向对象的多线程技术 3. NSObject多线程技术 4.苹果推荐使用的GCD技术 5.GDC中的队列

  5. UITableView 表视图编辑

    UITableViewController(表视图控制器)继承自UIViewController,自带一个tableView self.view不是UIView而是UITableView dataso ...

  6. ios开发--KVO浅析

    目标:监听NSMutableArray对象中增加了什么 代码如下: - (void)viewDidLoad { [super viewDidLoad]; self.dataArray = [NSMut ...

  7. iOS 各种系统文件目录 临时,缓存,document,lib,归档,序列化

    /** 1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 3 ...

  8. MVC 中如何将带有标签的字符串转换为HTML 标签 显示出来?

    出现问题的现象:

  9. 用telnet和php的curl库测试http

    一.telnet测试http telnet简介     Telnet协议是TCP/IP协议族的其中之一,是Internet远端登录服务的标准协议和主要方式,常用于网页服务器的远端控制,可供使用者在本地 ...

  10. 结队开发项目——基于Android的无线点餐系统——NABC模型

    特点:通过提前订餐,可以节约学生大量的排队时间. N(need):生活中可以发现许多同学都喜欢出去买饭,而且在有的摊位需要排很长时间的队,这样他们就会很晚吃到饭,下午有课的学生都不能睡午觉,所以通过我 ...