题意:

  给定身上的4种硬币,分别是1 ,5 ,10, 25面额各有多张,要求组成面额p的硬币尽可能多。输出组成p的4种硬币各自的数量。

思路:

  多重背包,300+ms。用01背包+二进制的方法。记录下所有的硬币的个数以及4种硬币分别的个数,注意初始化dp数组的不同之处。

 #include <iostream>
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std; const int N=, INF=-;
int coin[]={, , , };
int dp[N][], num[];
int p; void cal()
{
memset(dp,,sizeof(dp));
for(int i=; i<=p; i++) dp[i][]=INF;
for(int i=; i<; i++)
{
int k=, tmp=num[i];
while()
{
if(k>tmp&&tmp) k=tmp;
else if(k>tmp) break; for(int j=p; j>=k*coin[i]; j--)
{
if( dp[j-k*coin[i]][]!=INF &&dp[j][]<dp[j-k*coin[i]][]+k)
{
dp[j][]=dp[j-k*coin[i]][]+k;
for(int c=; c<=i+; c++) //复制次数
dp[j][c]=dp[j-k*coin[i]][c];
dp[j][i+]+=k; //添加次数
}
}
tmp-=k;
k<<=;
}
}
if(dp[p][]==INF) printf("Charlie cannot buy coffee.\n");
else printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n", dp[p][], dp[p][], dp[p][], dp[p][] );
} int main()
{ //freopen("input.txt", "r", stdin);
while(cin>>p,p)
{
int cnt=;
for(int i=; i<; i++)
{
scanf("%d", &num[i]);
cnt+=num[i]*coin[i];
}
if(cnt<p)
{
printf("Charlie cannot buy coffee.\n");
continue;
}
cal();
}
return ;
}

AC代码

POJ Charlie's Change 查理之转换(多重背包,变形)的更多相关文章

  1. Lightoj 1231 - Coin Change (I) (裸裸的多重背包)

    题目链接: Lightoj  1231 - Coin Change (I) 题目描述: 就是有n种硬币,每种硬币有两个属性(价值,数目).问用给定的硬币组成K面值,有多少种方案? 解题思路: 赤果果的 ...

  2. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...

  3. poj 3046 Ant Counting (DP多重背包变形)

    题目:http://poj.org/problem?id=3046 思路: dp [i] [j] :=前i种 构成个数为j的方法数. #include <cstdio> #include ...

  4. POJ 2392 Space Elevator(多重背包变形)

    Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...

  5. POJ 1276 Cash Machine(单调队列优化多重背包)

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38986   Accepted: 14186 De ...

  6. poj 1742 Coins(二进制拆分+bitset优化多重背包)

    \(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. ...

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

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

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

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

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

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

随机推荐

  1. Apache2.2安装图解

    Apache2.2安装图解 2010-12-14 15:32:44|  分类: 不学无术之杂 |  标签:安装  端口  httpd  apache2.2  服务器   |字号 订阅 Apache音译 ...

  2. 《深入分析Java Web技术内幕》读后感(Session、cookie)

    第10章 P263 理解Cookie 理解Session Session如何工作的

  3. hdu3047 Zjnu Stadium (并查集)

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. eclipse安装cppcheck

     简介: cppcheck 是一个 c 和 c++ 的静态的代码检查分析工具,不用运行程序就可以进行代码的检测. 可以检测一般的内存泄漏和程序编码错误 0.安装 cppcheck 1.57版本,这个版 ...

  5. 微信小程序开发之带搜索记录的搜索框

    实现功能:点击搜索框,有搜索记录时以下拉菜单显示,点击下拉子菜单,将数据赋值到搜索框,点击搜索图标搜索,支持清空历史记录,可手动输入和清空查询关键字, UI: wxml: <!--查询历史记录数 ...

  6. 将Opencv java中的Mat通过jni传递到C++中的方法

    public native void FindFeatures(long matAddrGr, long matAddrRgba); ... mRgba = new Mat(height, width ...

  7. 过滤asp.net页面每次发出请求之前访问

    public class PageFiltert : System.Web.UI.Page { public PageFiltert() { // //TODO: 在此处添加构造函数逻辑 // } p ...

  8. 如何快速编写大项目的Makefile文件

    在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情.因此,为了帮助程序员高效准确的编写makefile文件, ...

  9. 线性Softmax分类器实战

    1 概述 基础的理论知识参考线性SVM与Softmax分类器. 代码实现环境:python3 2 数据预处理 2.1 加载数据 将原始数据集放入"data/cifar10/"文件夹 ...

  10. 检查浏览器是否有此插件如flash

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...