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元,问 ...
随机推荐
- 第三天python3 字典
字典 dict 特点:key-value键值对的数据的集合 可变的.无序的.key不重复:非线性结构: 字典的初始化 d=dict() 或者 d = { } dict(**kwargs) 使用n ...
- openstack 虚拟机网卡被重名为cirename0
虚拟机网卡被重名为cirename0 在虚拟机挂载多网卡情况下,你在虚拟机上卸载网卡后,再创建新的port挂给虚拟机使用,如果虚拟机不经过重启的话,是不会有任何问题的.但是,如果虚拟机重启了,你 ...
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
- 主线程和创建多线程程序的第一种方式_创建Thread类的子类
/** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...
- python 操作json数据
简介 JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而 ...
- 彻底搞懂kubernetes调度框架与插件
调度框架 [1] 本文基于 kubernetes 1.24 进行分析 调度框架(Scheduling Framework)是Kubernetes 的调度器 kube-scheduler 设计的的可插拔 ...
- Vue 配置代理
说明:这里的vue代理是指用vue静态服务器做代理.使用的是 http-proxy-middleware 这个模块(这个模块相当于是node.js的一个插件). 版本: vue-cli 3.0以上 修 ...
- 利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标)
现而今,我们纵向的回顾整个大前端的历史,不难发现,人们对前端的审美要求越来越高,越来越严苛,与此同时,人们对追求美的体验是也极致的,从理性到感性,从平面到几何,从现实到虚拟,所以从某种角度来说,作为前 ...
- 华为分析&联运活动,助您提升游戏总体付费
ARPU如何提升?付费率如何提升?活动ROI如何提升?这些都是游戏运营人员较常遇到的难题.华为分析与联运活动可以帮助运营提升这些用户付费指标,通过对玩家打标签和用户画像,对目标群体的进行精准推送,实现 ...
- Luogu2574 XOR的艺术 (分块)
本是要练线段树的,却手贱打了个分块 //#include <iostream> #include <cstdio> #include <cstring> #incl ...