模板请看上一篇博客

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

下面为百度翻译

巫师使用硬币,他们有价值的硬币A1、A2、A3……银币。有一天,希比克斯打开钱包,发现里面有一些硬币。他决定在附近的一家商店买一块好看的手表。他想支付准确的价格(没有变化),他知道价格不会超过M,但他不知道手表的确切价格。

你要写一个程序,读取N、M、A1、A2、A3……和托尼、C2、C3…CN对应的值A1、A2、A3的硬币的数目,然后计算托尼可以用多少钱(形式1到M)来使用这些硬币。

输入

输入包含多个测试用例。每个测试用例的第一行包含两个整数n(1±n=100),m(m=100000)。第二行包含2n个整数,表示a1、a2、a3…a、c1、c2、c3…cn(1个ω小于100000,1个小于i的CI为1000)。最后一个测试用例后面是两个零。

输出

对于每一个测试用例,在一行上输出答案。

说实话 还是没看懂   看题意吧

有n种货币和手表价格为m,单位货币的价值有val[i],单位货币的数量有vol[i],。求解带哪些 货币val*货币数量vol 可将手表买回且身上的钱总价值最大题解:注意时间上的优化,为避免超时,将多重背包问题分成完全背包和01背包问题,01背包再用二进制优化

题目的意思:
  第一行输入,n,m分别表示n种硬币,m表示总钱数。
  第二行输入n个硬币的价值,和n个硬币的数量。
  输出这些硬币能表示的所有在m之内的硬币种数

#include <stdio.h>#include <iostream>
#include <algorithm>
#include <cstring>
#define MAX 1000000
using namespace std;
int dp[MAX];//存储最后背包最大能存多少
int value[MAX],weight[MAX],number[MAX];//分别存的是物品的价值,每一个的重量以及数量
int bag;
void ZeroOnePack(int weight,int value )//01背包
{int i;for(i = bag; i>=weight; i--){dp[i] = max(dp[i],dp[i-weight]+value);}
}
void CompletePack(int weight,int value)//完全背包
{int i;for(i = weight; i<=bag; i++){dp[i] = max(dp[i],dp[i-weight]+value);}
}void MultiplePack(int weight,int value,int number)//多重背包
{if(bag<=number*weight)//如果总容量比这个物品的容量要小,那么这个物品可以直到取完,相当于完全背包{CompletePack(weight,value);}else//否则就将多重背包转化为01背包{int k = 1;while(k<=number){ZeroOnePack(k*weight,k*value);number = number-k;k = 2*k;//这里采用二进制思想}ZeroOnePack(number*weight,number*value);}
}
int main()
{int n;while(~scanf("%d%d",&n,&bag)){if(n==0&&bag==0)break;int i,sum=0;for(i = 0; i<n; i++)scanf("%d",&value[i]);//输入价值for(i=0;i<n;i++)scanf("%d",&number[i]);//输入数量  此题没有物品的重量,可以理解为体积和价值相等memset(dp,0,sizeof(dp));for(i = 0; i<n; i++){MultiplePack(value[i],value[i],number[i]);//调用多重背包,注意穿参的时候分别是重量,价值和数量}int ans=0;for(i=1;i<=bag;i++){if(i==dp[i])ans++;}printf("%d\n",ans);}return 0;
}

第一组样例dp 存的是1 2 3 4 5 6 7 8 8 8     i==dp[i]的意思是容量为i的最优解  dp[9]最大是8 不能组成9的硬币 所以不成立

转载于:https://www.cnblogs.com/zcy19990813/p/9702748.html

Coins (多重背包)模板题相关推荐

  1. hdu2191 买大米 多重背包 模板题

    念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  2. 多重背包模板 C++

    多重背包模板 多重背包: 有N种物品和一个容量为V的背包.第i种物品最多有numi件可用. 每件物品的重量是wi,价值是vi. 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最 ...

  3. HDU 2844 Coins 多重背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2844 Coins Time Limit: 2000/1000 MS (Java/Others)Mem ...

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

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

  5. HDU 2844 Coins (多重背包)

    题目链接 题意:Tony想要买一个东西,他只有n种硬币,每种硬币的面值为a[i],每种硬币的数量为c[i],要买的物品价值不超过m,输出1-m中有多少种价格Tony可以用硬币组合出来. 题解:多重背包 ...

  6. 一本通 1270:【例9.14】混合背包(混合背包模板题)

    [题目描述] 一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn.有的物品只可以取一次(01背包),有的物品可以取无限次( ...

  7. 【POJ3260】The Fewest Coins 多重背包+完全背包

    A来B处买东西,价值M元,有N种钱,每种钱A有一定数量,而B有无限数量. 求最少用多少张钞票可以满足交易,比如样例,A出50+25,B找5,即可满足,需要3张. A用多重背包转移状态,B用完全背包. ...

  8. hdu2602 骨头收集者 01背包 模板题

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)

    题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活                                   ...

最新文章

  1. 粤嵌——电子相册代码实现
  2. Zabbix-3.0.3实现微信(WeChat)告警
  3. Android实现点击事件的4种方式
  4. Java程序员从笨鸟到菜鸟之(八十八)跟我学jquery(四)JQuery框架操作元素的属性与样式
  5. 干货!不得不知的UI界面中“行为召唤按钮”设计秘诀
  6. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
  7. php mongodb _id,PHP库 查询Mongodb中的文档ID的方法
  8. linux下解析域名
  9. php resque 计划任务,PHP-RESQUE - 实现重试
  10. jquery实现的视差滚动教程(视差大背景效果)
  11. 机器学习中数据预处理的方式
  12. 在线语音识别_腾讯云在线语音识别_在线语音识别成文字 - 云+社区 - 腾讯云
  13. 流量限制器(Flux Limiter)
  14. Git储藏和引用日志
  15. 闲来无事写个qt实现机器人
  16. 小程序接入h5页面_h5页面和小程序交互
  17. Numpy库的安装与初次使用
  18. python剪刀石头布_Python Tkinter教程系列01:剪刀石头布游戏
  19. 心动著境即是魔,随缘分别则无定
  20. 英语口语:进外企的一道坎

热门文章

  1. 龙之谷为什么不显示服务器列表,龙之谷选服务器的时候,字都看不到的。
  2. 焦化厂通过plc无线通信模块竟然可以解决生产安全问题
  3. C#图书管理系统之用户登陆界面实现(一)
  4. Mac音乐播放器哪款好用?
  5. 计算机网络第七版第一章习题答案自用
  6. 少儿编程微课程13:求多边行的内角和
  7. sw运行很卡怎么办_客户使用SolidWorks运行速度慢问题如何解决
  8. UE风格化Day2-房子建模
  9. 房子模型开门、关门操作
  10. 三维模型还原记忆中的老房子!居然是她的毕业作品....