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. GO中的逃逸分析

    1.什么是逃逸分析 以前写c/c++代码时,为了提高效率,常常将pass-by-value(传值)“升级”成pass-by-reference,企图避免构造函数的运行,并且直接返回一个指针. 那么这里 ...

  2. 使用malloc和free函数进行内存动态分配

    一.在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来 ...

  3. 常用ElasticSearch 查询语句

    为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(摘要), publish_date(发布 ...

  4. 数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...

  5. 巧用Grafana和Arthas自动抓取K8S中异常Java进程的线程堆栈

    前言 近期发现业务高峰期时刻会出现CPU繁忙导致的timeout异常,通过监控来看是因为Node上面的一些Pod突发抢占了大量CPU导致的. 问: 没有限制CPU吗?是不是限制的CPU使用值就可以解决 ...

  6. 2019-2020-1 20199326《Linux内核原理与分析》第一周作业

    开篇概述 我利用假期的时间自学了实验楼上的Linux基础入门前八个实验的课程,学习过程中遇到了一些小问题.但经过查资料等方式最终还是解决了问题.现将学到的一些知识点总结下来.方便日后复习查看. 1.零 ...

  7. [Qt] QString 常用函数

    1. append(), prepend() 2. count(), size(), length() 这三个函数是相同的 3. trimmed() 去掉首尾空格 4. isNull() 对未赋值的字 ...

  8. SpringCloudAlibaba实战教程系列

    一.简介 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开 ...

  9. ansible一键安装mysql8.0

    ansbile安装: # ansible在CentOS7中需要安装epel仓库 yum install -y epel-release yum install -y ansible 安装有好几种方法, ...

  10. Gym 101194D Ice Cream Tower

    被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...