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元,问 ...
随机推荐
- 2022-7-15 pan小堂 数组排序算法
二分查找(理解) public ych class{ public static void main(String[] args){ ///运用二分查找需要 数组在的值是递升的 int[] arr1 ...
- Matplotlib(基本用法)
Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析. 接下来展示的是Matplo ...
- 【达人专栏】还不会用Apache Dolphinscheduler吗,大佬用时一个月写出的最全入门教学【二】
02 Master启动流程 2.1 MasterServer的启动 在正式开始前,笔者想先鼓励一下大家.我们知道启动Master其实就是启动MasterServer,本质上与其他SpringBoot项 ...
- MySQL 数据操纵语句
插入 插入多个字段 insert into grade (`name`) values ('大一'),('大二'),('大三'),('大四'); 修改 设置时间为当前时间 update `studen ...
- navicat创建连接 2002-can‘t connect to server on ....
环境: 系统:centos7 生产环境:docker 中部署MySQL 报错提示符:"2002-Can't connect to server on '192.168.200.22'(100 ...
- 前端 | HTML5基础知识
1 HTML定义 HTML(英文Hyper Text Markup Language的缩写)中文译为"超文本标签语言",主要是通过HTML标签对网页中的文本.图片.声音等内容进行描 ...
- Canvas 线性图形(二):圆形
函数 arc(x, y, radius, startAngle, endAngle, counterclockwise) 参数名 描述 x.y 圆心坐标轴 radius 圆的半径 startAngle ...
- 【manim】含有add_updater更新函数become的物体移动方法
在manim社区版本中, 一.对于一般的物体,移动的方法分为 (瞬移) 和 (带动画移动) 1.瞬移 #直接对物体操作即可 obj.shift(LEFT) #瞬间移 ...
- JDBC的学习 3-1
JDBC的学习 3-1 JDBC基本概念 快速入门 对JDBC中各个接口和类详解 JDBC : 概念 :Java DateBase Connectivity java数据库连接,Java语言操作数据库 ...
- fastadmin后台分页设置显示方法
1.参照日志列表的分页(后台代码都有) 2.修改默认分页配置,在初始化里面加上: pageList: [5,10,'all'], 3.显示列表: [$where, $sort, $order, $ ...