多重背包 可行性+路径记录

题意是说你要用很多其它的零钱去买咖啡。最后输出你分别要用的 1,5 ,10 。25 的钱的数量。

多重背包二进制分解。然后记录下 这个状态。最后逆向推就可以。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
using namespace std;
int dp[10001];
int cot[4];
int value[]={1,5,10,25};
int n;
struct lx
{
int va,co;
}v[10001];
int zero(int cost,int i,int co)
{
cost*=co;
for(int j=n;j>=cost;j--) if(dp[j-cost]+co>dp[j])
{
dp[j]=dp[j-cost]+co;
v[j].va=i;
v[j].co=co;
}
}
int main()
{
while(scanf("%d",&n))
{
for(int i=0;i<4;i++)
scanf("%d",&cot[i]);
if(n==0)return 0;
for(int i=0;i<=n;i++)
dp[i]=-100001;
dp[0]=0; for(int i=0;i<4;i++)
{
if(cot[i]==0)continue;
if(value[i]*cot[i]>=n)
{
for(int j=value[i];j<=n;j++)
if(dp[j-value[i]]+1>dp[j])
{
dp[j]=dp[j-value[i]]+1;
v[j].va=i;
v[j].co=1;
}
}
else
{
int k=1;
int tmp=cot[i];
while(k<tmp)
{
zero(value[i],i,k);
tmp-=k;
k*=2;
}
zero(value[i],i,tmp);
}
}
if(dp[n]<=0)puts("Charlie cannot buy coffee.");
else
{
// for(int i=0;i<=n;i++)
// printf("%d : %d*%d\n",i,v[i].co,v[i].va);
memset(cot,0,sizeof(cot));
while(n)
{
int i=v[n].va;
int co=v[n].co;
cot[i]+=co;
// printf("%d ==\n",co);
n-=value[i]*co;
}
printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",cot[0],cot[1],cot[2],cot[3]);
}
}
}

POJ 1787 Charlie&#39;s Change的更多相关文章

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

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

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

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

  3. POJ 1787 Charlie's Change (完全背包/多重背包,输出方案的物品个数)

    网上说是多重背包,因为要输出方案,还要记录下路径,百度一下题解就可以. 自己做的时候,还没了解过多重背包,该题直接往完全背包思考了.咖啡的钱看作总的背包容量,1.5.10.25分别代表四种物品的重量, ...

  4. poj 1787 Charlie's Change

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

  5. zoj 2156 - Charlie&#39;s Change

    称号:拼布钱,表面值至1,5.10.25.寻求组成n表面值硬币的最大数目. 分析:dp,01背包.需要二元分割,除此以外TLE.使用每个硬币的数组记录数.轻松升级. 写了一个 多重背包的 O(NV)反 ...

  6. poj 1787 背包+记录路径

    http://poj.org/problem?id=1787 Charlie's Change Time Limit: 1000MS   Memory Limit: 30000K Total Subm ...

  7. 专题复习--背包问题+例题(HDU 2602 、POJ 2063、 POJ 1787、 UVA 674 、UVA 147)

    *注 虽然没什么人看我的博客但我还是要认认真真写给自己看 背包问题应用场景给定 n 种物品和一个背包.物品 i 的重量是 w i ,其价值为 v i ,背包的容量为C.应该如何选择装入背包中的物品,使 ...

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

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

  9. Charlie's Change POJ - 1787

    Time limit 1000 ms Memory limit 30000 kB description Charlie is a driver of Advanced Cargo Movement, ...

随机推荐

  1. favicon还是这个网站生成的比较正确

    原文发布时间为:2011-11-16 -- 来源于本人的百度文章 [由搬家工具导入] http://tools.dynamicdrive.com/favicon/ http://www.rw-desi ...

  2. 用.net开发wap

    原文发布时间为:2010-08-19 -- 来源于本人的百度文章 [由搬家工具导入] .NET 模板:http://download.csdn.net/source/2631001 WAP应用程序结构 ...

  3. 【自己的练习git】自己的git练习

    liqiang@username MINGW64 ~/Desktop$ mkdir TestGit        新建目录 liqiang@username MINGW64 ~/Desktop$ cd ...

  4. WSDL协议简单介绍

    WSDL – WebService Description Language – Web服务描述语言 通过XML形式说明服务在什么地方-地址. 通过XML形式说明服务提供什么样的方法 – 如何调用. ...

  5. sourceInsight4 破解笔记(完美破解)【转】

    转自:http://www.cnblogs.com/Napoleon-Wang/p/6706773.html 软件下载地址:http://www.cr173.com/soft/421803.html ...

  6. LeetCode OJ-- Sudoku Solver ***

    https://oj.leetcode.com/problems/sudoku-solver/ 九宫格数独问题. 一行上为1 2 3 到9 一列上为1 2 3 到9 每个小的3*3格子为 1 2 3 ...

  7. springBoot AOP环绕增强、自定义注解、log4j2、MDC

    (一)log4j2 maven配置 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  8. Cryptography I 学习笔记 --- 基于陷门置换的公钥加密

    RSA算法的工作流程 1. 生成公钥私钥 生成两个素数p和q,计算n=p*q,计算φ(n)=n-p-q+1,然后生成e与d,使 e * d = 1 mod φ(n). 然后以(n, e)作为公钥,(n ...

  9. Codeforces 922F Divisibility (构造 + 数论)

    题目链接  Divisibility 题意 给定$n$和$k$,构造一个集合$\left\{1, 2, 3, ..., n \right\}$的子集,使得在这个集合中恰好有$k$对正整数$(x, y) ...

  10. Light oj 1125 - Divisible Group Sums (dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1125 题意: 给你n个数,q次询问,每次询问问你取其中m个数是d的整数倍的方案 ...