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.桥接方法简介 桥接方法是jdk1.5引入泛型后,为使java泛型方法生成的字节码与jdk1.5版本之前的字节码兼容由编译器自动生成的. 可用method.isBridge() 判断method是否 ...
- php rand()和mt_ran(),还有随机数生成器
PHP 的 rand() 函数默认使用 libc 随机数发生器.mt_rand() 函数是非正式用来替换它的.该函数用了 Mersenne Twister 中已知的特性作为随机数发生器,它可以产生随机 ...
- windows下memcache安装
Windows下的Memcache安装:1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:memcached2. 在终端(也即cmd命令界面)下输入 'c:memcache ...
- [护网杯 2018]easy_tornado-1|SSTI注入
1.打开之后给出了三个连接,分别查看下三个连接内得信息,结果如下: 2.url中参数包含一个文件名与一串应该是md5得加密的字符串,文件名已经获得了,就需要获取加密得字符串,但是加密字符串时需要使用到 ...
- Git 10 IDEA撤销推送
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 如果推送了多 ...
- java-流的使用完结与异常处理机制
1.1java.io.objectInputStream 对象输入流:用于将一组字节(通过对象输出流写出对象而转换的一组字节)读取并转换为对应的对象.对象输出流将对象写出时转换为一组字节的过程,称为: ...
- RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- Spring源码环境搭建
Spring源码在github上,地址是https://github.com/spring-projects/spring-framework/,选择5.3.x版本,直接从github上克隆项目网速很 ...
- java数组---多维数组
多维数组 多维数组可以看成是数组的数组 比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 public static void main(String[] args) { ...
- 内网技巧-通过SAM数据库获得本地用户hash的方法
内网技巧-通过SAM数据库获得本地用户hash的方法 在windows上的C:\Windows\System32\config目录保存着当前用户的密码hash.我们可以使用相关手段获取该hash. 提 ...