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元,问 ...
随机推荐
- Mysql性能调优-工具篇
EXPLAIN 首先祭出官方文档(这是5.7的,请自行选择版本): Understanding the Query Execution Plan 英文不想看,就看这篇吧: 全网最全 | MySQL E ...
- 《HelloGitHub》第 76 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- kubernetes之DaemonSet以及滚动更新
1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当 ...
- 针对单个球体的World类
好了,终于到了可以看到图片的环节了.之前的类,你一定要实现好了.所有关于World类的报错,现在我们一个一个解决来了. 先看看World类的声明: #pragma once #ifndef __WOR ...
- Flask像Jenkins一样构建自动化测试任务
flask这个框架很轻量,做一些小工具还是可以很快上手的. 1.自动化 某一天你入职了一家高大上的科技公司,开心的做着软件测试的工作,每天点点点,下班就走,晚上陪女朋友玩王者,生活很惬意. 但是美好时 ...
- MyBatis-Plus 代码生成
MyBatis-Plus官网的代码生成器配置不是特别全,在此整理了较为完整的配置,供自己和大家查阅学习. // 代码生成器 AutoGenerator mpg = new AutoGenerator( ...
- 面试突击75:SpringBoot 有几种读取配置文件的方法?
Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读 ...
- 浅谈 Raft 分布式一致性协议|图解 Raft
前言 本篇文章将模拟一个KV数据读写服务,从提供单一节点读写服务,到结合分布式一致性协议(Raft)后,逐步扩展为一个分布式的,满足一致性读写需求的读写服务的过程. 其中将配合引入Raft协议的种种概 ...
- RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- 【Java】学习路径62-枚举类型
public enum Role { TEACHER,STUDENT,CHEF } 使用: System.out.println(r1);//输出TEACHER System.out.println( ...