http://poj.org/problem?id=1787

这个题目我一看就觉得是一个多重背包,但是呢,我不知道怎么输出路径,所以无可奈何,我就只能看一下题解了。

看了题解发现居然是把多重背包转化成完全背包,昨天学习了多重背包转化成01背包求解,今天又学习了这个。

题目大意:就是给你一个数字n,和1分钱的数量,5分钱的数量,10分钱的数量,25分钱的数量,

让你求组成这个数字n需要1分钱5分钱10分钱25分钱的数量,输出。

思路:

dp[i]定义为组成 i 的硬币数量最多为多少。

这个题目就是把硬币的价格当作容量,把硬币的数量当作数量,每一个硬币的价值都是1.

所以这个因为必须装满,所以dp[0]=0,其他都是-inf,转移方程就很简单了,这个具体看代码

最后就是一个路径记录,因为这个是多重背包,所以需要一个数组对某一种硬币使用数量进行限制。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + ; int dp[maxn], used[maxn], path[maxn];
int weight[] = { ,,, }; int main()
{
int n, num[];
while(scanf("%d%d%d%d%d",&n,&num[],&num[],&num[],&num[])!=EOF)
{
if (n == && num[] == && num[] == && num[] == && num[] == ) break;
memset(dp, -inf, sizeof(dp));
memset(path, , sizeof(path));
dp[] = ;
path[] = -;
for(int i=;i<;i++)
{
memset(used, , sizeof(used));
for(int j=weight[i];j<=n;j++)
{
if(dp[j-weight[i]]+>dp[j]&&dp[j-weight[i]]>=&&used[j-weight[i]]<num[i])
{
dp[j] = dp[j - weight[i]] + ;
path[j] = j - weight[i];
used[j] = used[j - weight[i]] + ;
}
}
}
if (dp[n] < ) printf("Charlie cannot buy coffee.\n");
else
{
int ans[];
memset(ans, , sizeof(ans));
while(path[n]!=-)
{
ans[n - path[n]]++;
n = path[n];
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n", ans[weight[]], ans[weight[]], ans[weight[]], ans[weight[]]);
}
}
return ;
}

多重背包转化成完全背包 E - Charlie's Change的更多相关文章

  1. (多重背包+记录路径)Charlie's Change (poj 1787)

    http://poj.org/problem?id=1787   描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...

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

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

  3. 转化为分组背包 zoj 3769

    题目链接:https://vjudge.net/problem/ZOJ-3769 题意:现在你要去打怪,你有13种装备,每件装备会有伤害和防御两种属性,一般来说,每种装备只可以装备一件,但是特别的,戒 ...

  4. Charlie's Change(完全背包+路径记忆)

    Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3176   Accepted: 913 D ...

  5. HDU——2191悼念512汶川大地震遇难同胞(多重背包转化为01背包或二进制优化)

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. Charlie's Change(完全背包记录路径)

    Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...

  7. day116:MoFang:显示背包解锁/未解锁格子数&显示背包的道具物品&背包解锁

    目录 1.显示背包的已解锁/未解锁格子数 2.显示背包中的道具物品 3.用户购买道具的时候,判断背包存储是否达到上限 4.道具也可以使用积分购买 5.在商城界面根据金额/积分显示不同商品 6.背包解锁 ...

  8. [LeetCode] Integer to Roman 整数转化成罗马数字

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...

  9. HTML5将图片转化成字符画

    HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...

随机推荐

  1. 宏定义#define和内联函数inline的区别

    1 宏定义在预编译的时候进行字符串替换.内联函数在编译的时候进行函数展开. 2 宏定义没有类型检查.内联函数会进行参数列表.返回值等类型检查.

  2. golang 在 Mac , Linux , Windows 下交叉编译详解

    一. 前言 Golang 支持交叉编译, 在一个平台上生成然后再另外一个平台去执行. 而且编译的工具[build]这个工具是Golang 内置的,不需要你去下载第三方的包啥的,贼方便. 二. 交叉编译 ...

  3. ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

    ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...

  4. AJ学IOS(16)UI之XIB自定义Cell实现团购UI

    AJ分享,必须精品 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XI ...

  5. [模板]SPFA判负环

    目录 一.BFS法判负环 二.DFS法判负环 三.SPFA判正环 一.BFS法判负环 Code: #include<bits/stdc++.h> #define re register # ...

  6. Juli函数

  7. 关于Python+selenium 定位浏览器弹窗元素

    首先要确定弹窗的类型: (1)div弹窗 (2)新标签页弹窗 (3)alert弹窗 一,div弹窗div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样.不过这里会有一个坑,明明可以找到这个 ...

  8. 挑战全网最幽默的Vuex系列教程:第三讲 Vuex旗下的Mutation

    写在前面 上一讲「Vuex 旗下的 State 和 Getter」,告诉了我们怎么去使用仓库 store 中的状态数据.当然,光会用肯定还不够,大部分的应用场景还得对这些状态进行操控,那么具体如何操控 ...

  9. python web的进化历程

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 阶段1 socket服务端和客户端都自己编写 实现访问8080端口,返回一个'hello wo ...

  10. 每天都在用,但你知道 Tomcat 的线程池有多努力吗?

    这是why的第 45 篇原创文章.说点不一样的线程池执行策略和线程拒绝策略,探讨怎么让线程池先用完最大线程池再把任务放到队列中. 荒腔走板 大家好,我是 why,一个四川程序猿,成都好男人. 先是本号 ...