HDU2844 Coins(多重背包)
多重背包就是每种物品有数量限制时求解最大价值。
如果一种物品数量和重量之积超过背包容量,可视为完全背包;其余情况通过二进制拆分,将几个数量的物品看成一个,转化为01背包求解。
按照这种思路代码是这样的:
1 #include<cstdio>//多重背包,二进制拆分
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 #define M 100005
6 bool dp[M];//dp[j]表示和为j的组合方式是否可行
7 int v[105],c[105];//价值,数量
8
9 void multi_knapsack(int n,int m){
10 for(int i=1;i<=n;i++){
11 if(c[i]*v[i]>=m){//转化为完全背包
12 for(int j=v[i];j<=m;j++)
13 if(dp[j-v[i]]) dp[j]=1;
14 }
15 else{
16 for(int k=1;c[i]>0;k<<=1){
17 int x=min(k,c[i]);
18 for(int j=m;j>=v[i]*x;j--)//转化为01背包
19 if(dp[j-v[i]*x]) dp[j]=1;
20 c[i]-=x;
21 }
22 }
23 }
24 }
25
26 int main(){
27 int n,m;
28 while(~scanf("%d%d",&n,&m),n+m){
29 for(int i=1;i<=n;i++) scanf("%d",&v[i]);
30 for(int i=1;i<=n;i++) scanf("%d",&c[i]);
31 memset(dp,0,sizeof(dp));
32 dp[0]=1;//初始状态0可达
33 multi_knapsack(n,m);
34 int ans=0;
35 for(int i=1;i<=m;i++)
36 ans+=dp[i];
37 printf("%d\n",ans);
38 }
39 return 0;
40 }
注意到这道题是可行性问题,可以用一个数组used[j]记录拼成价值j是用了多少个第i种物品,实现数量限制约束。
1 #include<cstdio>//数组优化
2 #include<cstring>
3 using namespace std;
4 #define M 100005
5 int v[105],c[105],used[M];
6 bool dp[M];
7
8 int main(){
9 int n,m,ans;
10 while(~scanf("%d%d",&n,&m),n&&m){
11 for(int i=1;i<=n;i++) scanf("%d",&v[i]);
12 for(int i=1;i<=n;i++) scanf("%d",&c[i]);
13 memset(dp,0,sizeof(dp));
14 ans=0,dp[0]=1;
15 for(int i=1;i<=n;i++){
16 memset(used,0,sizeof(used));
17 for(int j=v[i];j<=m;j++)
18 if(!dp[j]&&dp[j-v[i]]&&used[j-v[i]]<c[i]){
19 dp[j]=1;
20 used[j]=used[j-v[i]]+1;
21 ans++;
22 }
23 }
24 printf("%d\n",ans);
25 }
26 return 0;
27 }
HDU2844 Coins(多重背包)的更多相关文章
- HDU-2844 Coins(多重背包)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- HDU2844 Coins 多重背包
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU-2844 Coins 多重背包 物品数量二进制优化
题目链接:https://cn.vjudge.net/problem/HDU-2844 题意 给你一些不同价值和一定数量n的硬币. 求用这些硬币可以组合成价值在[1 , m]之间的有多少. 思路 多重 ...
- hdu2844 Coins -----多重背包+二进制优化
题目意思:给出你n种硬币的面额和数量,询问它能够组合成1~m元中的几种情况. 这题如果直接按照完全背包来写的话,会因为每一种硬币的数目1 ≤ Ci ≤ 1000而超时,所以这里需要运用二进制优化来解决 ...
- POJ 3260 The Fewest Coins(多重背包+全然背包)
POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...
- POJ1742 Coins[多重背包可行性]
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 34814 Accepted: 11828 Descripti ...
- POJ3260——The Fewest Coins(多重背包+完全背包)
The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...
- POJ 1742 Coins(多重背包, 单调队列)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- HDu -2844 Coins多重背包
这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...
- hdu2844(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:一位同学想要买手表,他有n种硬币,每种硬币已知有num[i]个.已知手表的价钱最多m元,问 ...
随机推荐
- Java学习 (八)基础篇 运算符
目录 运算符 基本运算符 1.一元基础运算(重点) 一元运算符 (a++ / ++a) (a-- / --a) 2.二元基础运算 基础 计算返回值类型 关系运算 幂运算 3.三元运算符 4.逻辑运算符 ...
- 2022,我们继续探索开源 New Style!
- 【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。
不记得是怎么接触并最终研究这个课题的了,认识我的人都知道我是没有固定的研究对象的,一切看运气和当时的兴趣.本来研究完了就放在那里了,一直比较懒的去做总结,但是想一想似乎在网络上就没有看到关于这个方面的 ...
- MySQL8.0解决“MySQL 服务无法启动。 服务没有报告任何错误。”
TL;NRs 初始化服务时最好使用mysqld --initialized --console命令: MySQL8.0的配置变量与MySQL5.7不同,[mysqld]下面设置字符集的变量名为char ...
- 使用 Java 操作 Redis
Jedis 1. 概述 Jedis 是一款使用 Java 操作 Redis 的工具,有点类似于 JDBC 2. 引入依赖 <dependency> <groupId>redis ...
- java-异常处理和线程的一些简单方法及使用
1.1 子类重写父类含有throws声明异常抛出的方法时的规则: 1.允许不再抛出任何异常. 2.仅抛出部分异常. 3.抛出父类方法抛出异常的子类型异常. 4.不可以抛出额外异常. 5.不能抛出父类方 ...
- mybatisplus-sql注入器
sql注入器 使用mybatisplus只需要继承BaseMapper接口即可使用:但是有新的需求需要扩展BaseMapper里面的功能时可使用sql注入器. 扩展BaseMapper里面的功能 点击 ...
- [CF1525D] Armchairs (DP / 模拟费用流)
题面简述 一条线上等距地分布着 n n n 老鼠和 m m m 洞( m ≥ n m\geq n m≥n),这连续 n + m n+m n+m 个位置上要么是老鼠要么是洞,一个老鼠进一个洞,代价是所有 ...
- Html飞机大战(一):绘制动态背景
好家伙,飞机大战终于开始弄了 这会有很多很多复杂的东西,但是我们总要从最简单,和最基础的部分开始, 我们先从背景开始弄吧! 1.绘制静态背景 这里我们会用到canvas <!DOCTYPE ...
- 第八十八篇:Vue keep-alive的使用 让组件"活下去""
好家伙, 1.关于keep-alive 这是一个用于阻止组件自行销毁的插件 <!-- keep-alive可以把内部组件进行缓存,而不是销毁组件 --> 那么我们什么时候会用到他呢? 举个 ...