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

自己做的时候,还没了解过多重背包,该题直接往完全背包思考了。
咖啡的钱看作总的背包容量,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. hdu 5104 Primes Problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5104 Primes Problem Description Given a number n, ple ...

  2. hdu 2648 Shopping

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2648 纯暴力的方法T_T... 如下: #include<cstdio> #include ...

  3. ios中怎么样设置drawRect方法中绘图的位置

    其中drawRect方法中的参数rect就是用来设置位置的,

  4. java intellij 写控制台程序 窗口程序

    建一个空项目,建一个main函数  用application,就可以运行了 /**  * Created by robin on 15/10/11. */public class hello { pu ...

  5. linux命令行下使用R语言绘图

    系统:centos 6.4 64bit 环境安装参考:http://hi.baidu.com/solohac/item/4a18e78f1bef9b5825ebd99c 在R语言中可以使用png()等 ...

  6. sqlserver复杂排序(order by case when)

     /*表 sysid自增主键  scro分数  oper操作时间 scro分数 > 5的按照  分数 降序, 分数小于等于5的按照 操作时间 升序; >5 的排在 <=5的前面*/ ...

  7. C中的一些函数

    简述:printf.sprintf函数 转载自http://www.cnblogs.com/adslg/archive/2008/08/22/1274164.html 部分进行了修改,参考http:/ ...

  8. 监听文本框输入开发仿新浪微博限制输入字数的textarea插件

    监听文本框输入 Firefox.Chrome.IE9,IE10 均支持 oninput 事件,此外所有版本的 IE 均支持 onpropertychange 事件. oninput 事件在用户输入.退 ...

  9. Socket的双网卡收发(C#)

    最近的一个项目中需要同时使用两块网卡收发UDP组播数据包,并且要求使用Socket的方式接收和发送网络数据包(我不会告诉你们我之前是直接使用SharpPcap来实现的).在C#中Socket接触的比较 ...

  10. 配置Symfony2

    安装成功后打开server php app/console server:run 127.0.0.1:8000 然后在浏览器输入localhost/8000/config.php进行配置 1.date ...