Coins

Time Limit: 2000/1000 MS (Java/Others)    Memory
Limit: 32768/32768 K (Java/Others)

Total Submission(s): 9826    Accepted Submission(s): 3916

Problem Description
Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the
price would not more than m.But he didn't know the exact price of the watch.

You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
 

Input
The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000). The last test case is followed
by two zeros.
 

Output
For each test case output the answer on a single line.
 

Sample Input

3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0
 

Sample Output
8

题意:有n中面值的硬币每种面值的硬币数量已知问这些硬币能组成1-m中的几种多重背包已m作为背包容量在1-m中当有物品的价值等
于背包容量时即能组成该类型。




解题心得:
1、就是一个多重背包的二进制优化问题,题目要求的是一个最后表价格可能的个数。
2、关于多重背包的二进制优化问题(多重背包的二进制优化
#include<bits/stdc++.h>
using namespace std;
const int maxn1 = 1e5+100;
const int maxn2 = 110;
int n,m;
bool dp[maxn1];
struct Coin
{
int num;
int va;
} c[maxn2]; int pre_coin()
{
int sum = 0;
for(int i=1; i<=n; i++)
scanf("%d",&c[i].va);
for(int i=1; i<=n; i++)
{
scanf("%d",&c[i].num);
sum += c[i].num * c[i].va;
}
}
int main()
{
while(scanf("%d%d",&n,&m) && n+m)
{
memset(dp,0,sizeof(dp));
dp[0] = true;
pre_coin();
for(int i=1; i<=n; i++)
{
int cnt = 0;
for(int k=1; k<=c[i].num; k*=2)//k*=2二进制优化
{
cnt = k*c[i].va;
for(int j=m; j>=cnt; j--)
if(dp[j-cnt])
dp[j] = true;
c[i].num -= k;
} if(cnt)
{
cnt = c[i].num * c[i].va;
for(int j=m; j>=cnt; j--)
{
if(dp[j-cnt])
dp[j] = true;
}
}
} int Sum = 0;//记录可能是手表价格的个数
for(int i=m; i>=1; i--)
if(dp[i])
Sum ++;
printf("%d\n",Sum);
}
}



动态规划:HDU2844-Coins(多重背包的二进制优化)的更多相关文章

  1. HDU-2844 Coins 多重背包 物品数量二进制优化

    题目链接:https://cn.vjudge.net/problem/HDU-2844 题意 给你一些不同价值和一定数量n的硬币. 求用这些硬币可以组合成价值在[1 , m]之间的有多少. 思路 多重 ...

  2. HDU 1059(多重背包加二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others)    Me ...

  3. hdu2844 Coins -----多重背包+二进制优化

    题目意思:给出你n种硬币的面额和数量,询问它能够组合成1~m元中的几种情况. 这题如果直接按照完全背包来写的话,会因为每一种硬币的数目1 ≤ Ci ≤ 1000而超时,所以这里需要运用二进制优化来解决 ...

  4. luogu||P1776||宝物筛选||多重背包||dp||二进制优化

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  5. CodeForces922E DP//多重背包的二进制优化

    https://cn.vjudge.net/problem/1365218/origin 题意 一条直线上有n棵树 每棵树上有ci只鸟 在一棵树底下召唤一只鸟的魔法代价是costi 每召唤一只鸟,魔法 ...

  6. 动态规划:HDU1059-Dividing(多重背包问题的二进制优化)

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. dp之多重背包(二进制优化)

    void solve(int v,int w,int c){    int count=0;    for(int k=1;k<=c;k<<=1)    {        val[c ...

  8. POJ 1276 Cash Machine(多重背包的二进制优化)

    题目网址:http://poj.org/problem?id=1276 思路: 很明显是多重背包,把总金额看作是背包的容量. 刚开始是想把单个金额当做一个物品,用三层循环来 转换成01背包来做.T了… ...

  9. HDU-2844 Coins(多重背包)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

随机推荐

  1. matlab 基本操作

    导入excel 右键excel文件, import data, 选择column vector点击导入即可, 在右侧的workspace就可以看到添加的列变量了 在workspace中右键添加clas ...

  2. c#基础 函数传值

    随便新建个控制台程序做个演示! 1.最基础,最普通的传值方式: static void Main(string[] args) { ); Console.WriteLine("x:" ...

  3. [翻译] Facebook HHVM 团队封闭开发三周成果展

    本人翻译的一篇文章,首发于伯乐在线. [补充信息]HipHop for PHP是一系列PHP脚本语言的程式码转换器的集合,它包含HPHPc.HPHPi.HPHPd以及HHVM,这四个脚本引擎各有所不同 ...

  4. sublime 主要使用方法

    ---------------最常用的1.新建文件-输入"html:xt"后 按"Ctrl+E键"或 "tab键" ,可快速生成xhtml ...

  5. 并发访问sqlite数据库出现databse is locked的错误的一个解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite数据库对并发支持不太 ...

  6. GBase数据库存储过程——批量查询多个数据表的磁盘占用情况

    --清理历史表,可选 DROP TABLE IF EXISTS `dap_model`.`data_statics`; CREATE TABLE `dba`.`data_statics` ( `TAB ...

  7. JavaScript基础:(加号,数值转换,布尔转换)

    JavaScript中加号运算符"+" 运算过程理解 1) 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始值.日期对象通过toString()方法执行转换, ...

  8. Git 推送和删除标签

    事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:re ...

  9. OpenSSL命令---s_client

    http://blog.csdn.net/as3luyuan123/article/details/16812071 用途: s_client为一个SSL/TLS客户端程序,与s_server对应,它 ...

  10. HDU4302 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4302 , 可以用线段树,也可以STL中的map,multiset,优先队列中的任何一个解决(可我只会线 ...