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
4
 
题目就是让你用所给的 种类一定,数目一定的硬币,看能组成的数字有那先(当然,询问范围是1 ~ m)
还是列出已知条件,硬币的种类,每类的个数,查询范围(1 ~ m)
在多重背包里,我们用到的条件有:背包容量,物品种类,物品每类的数量, 物品每类所用的体积大小
抽象这道题目,我们直观的知道,硬币的种类,硬币每类的数量,每类硬币的面值。题目里只有这 3 个条件, 做背包问题一定会涉及“物品占用体积的大小”,而这道题完全没有提 ,因为我们最后求的是所能组成面值的总数。 这里提一下,我们的面值,既可以当作物品的重量,又可以当作物品占的体积
 
 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std;
const int max_size = + ;
const int MAX = ;
int dp[max_size];
bool vis[max_size]; int main()
{
//1.将问题的模型抽象出来
int cnt, vol;
int val[MAX];
int num[MAX];
while(scanf("%d %d", &cnt, &vol) != EOF)
{
memset(dp, , sizeof(dp));
memset(vis, false, sizeof(vis));
if(cnt == && vol == )
break;
for(int i = ; i < cnt; i++)
scanf("%d", val+i);
for(int i = ; i < cnt; i++)
scanf("%d", num+i); for(int i = ; i < cnt; i++)
{
if(val[i] * num[i] >= vol)
{
//CompletePack(val[i], val[i]); //那么多的价值,那么多的占用? for(int j = val[i]; j <= vol; j++) ///多重背包这里错了两次了,要注意,昨天找了一晚上
{
dp[j] = max(dp[j], dp[j - val[i]] + val[i]);
vis[dp[j]] = true;
}
continue;
}
int k = ;
while(k < num[i])
{
//ZeroOnePack(k*val[i], k*val[i]);
for(int j = vol; j - k * val[i] >= ; j--)
{
dp[j] = max(dp[j], dp[j-k*val[i]] + k*val[i]);
vis[dp[j]] = true;
}
num[i] -= k;
k *= ;
}
//ZeroOnePack(num[i]*val[i], num[i]*val[i]);
for(int j = vol; j - num[i]*val[i] >= ; j--)
{
dp[j] = max(dp[j], dp[j - num[i]*val[i]] + num[i]*val[i]);
vis[dp[j]] = true;
}
} int ans = ;
for(int i = ; i <= vol; i++)
{
ans += (vis[i] == true) ? : ;
}
printf("%d\n", ans);
}
return ;
}

HDU-2844 Coins(多重背包)的更多相关文章

  1. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

  2. HDu -2844 Coins多重背包

    这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...

  3. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  4. HDU 2844 Coins (多重背包计数 空间换时间)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  5. hdu 2844 coins(多重背包 二进制拆分法)

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

  6. hdu 2844 Coins 多重背包(模板) *

    Coins                                                                             Time Limit: 2000/1 ...

  7. HDU 2844 Coin 多重背包

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  9. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  10. POJ 3260 The Fewest Coins(多重背包+全然背包)

    POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...

随机推荐

  1. Lattice Diamond 学习之编译、检查和设置约束

    在新建工程以及完成代码的输入之后.则就要进行编译,并检测错误. 一. Generate Hierarchy(产生层次结构). 1. 点击Generate Hierarchy 图标或者Design -- ...

  2. PHP超全局变量

    PHP提供了九种超全局变量(数组) 1 $_GET //地址栏上获得的值 2 $_POST //POST表单发送的数据 3 $_REQUEST //GET和POST的内容全都有 4 $_SERVER ...

  3. C/C++学习笔记---高地址、低地址、大段字节序、小段字节序

    字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序. 小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处: 大端字节序是高字节数据存放在低地址 ...

  4. 自动复制转换StringBuffer

    自动复制转换StringBuffer http://www.cnblogs.com/coqn/archive/2012/07/31/all_StringBuufer.html http://blog. ...

  5. vim: vs sp 调整窗口高度和宽度

    转自:http://www.cnblogs.com/xuechao/archive/2011/03/29/1999292.html vim多窗口有时候需要调整默认的窗口宽度和高度,可以用如下命令配合使 ...

  6. Delphi中函数定义和声明的位置

    当函数(或过程)A定义在函数(或过程)B之前,那么函数B就可以调用函数A,并且编译成功,例如下面的 procedure TForm1.btn1Click(Sender: TObject); 和   f ...

  7. Swipe JS – 移动WEB页面内容触摸滑动类库

    想必做移动前端的同学经常会接到这样子的一个需求,就是在移动设备页面上的banner图能够用手指触摸左右或上下的滑动切换,这在移动设备是个很常见的一个效果,其用户体验远甚于点击一个按钮区域,通过手指的触 ...

  8. oracle JOB学习(一)---基础

    oracle job简介   下面文章来自网友(格式稍加整理)   主要的使用情景 定时在后台执行相关操作:如每天晚上0点将一张表的数据保存到另一张表中,2:定时备份数据库等   熟化说万事开头难,这 ...

  9. Introduction to replication 翻译

    翻译自用,还有很多谬误之处,敬请甄别,转载请注明出处 Introduction to replication (replication介绍)   Replication is one of the m ...

  10. memcache(使用php操作memcache)

    .概念 memcache 是一个高效的分布式的内存对象缓存系统,他可以支持把php的各种数据(数组,对象,基本数据类型)放在它管理的内存中 . 安装步骤 1.下载php_memcache.dll文件并 ...