当前位置:网站首页>动态规划背包问题之多重背包详解
动态规划背包问题之多重背包详解
2022-07-23 12:30:00 【四舍五入两米高的小晨】
背包问题前几篇文章:
一、什么是多重背包问题?
有n种物品,每种物品的单件体积为v[i],价值为w[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品有s[i]件。
多重背包和完全背包、01背包区别:
- 01背包在选择某一个物品时只有不选和选一次两种情况
- 完全背包在选择某一个物品时可以不选,也可以选一次,选两次。。。选择次数没有上限(只要背包能放下)
- 多重背包在选择某一个物品时可以不选,可以选一次、二次。。。最多只能选s[i]次(只要背包能放下)
二、例题分析
1. 题目:

原题测试样例不容易看出规律,因此使用其他的测试样例:
输入样例:
3 7qu
2 3 12
2 5 15
1 2 3
输出样例:
12
2.第一种:朴素做法
01背包:第i件物品可以取0件,可以取1件
多重背包:第i件物品可以取0件,取1件、取2件······取s[i]件
多重背包转化为01背包求解:把第i件物品换成s[i]件01背包中的物品,每件物品的体积为k* v[i],价值为k * w [i] (0<=k<=s[i])
核心代码:
for(i=1;i<=n;i++)
for(j=m;j>=v[i];j--)
for(k=0;k<=s[i]&&k*v[i]<=j;k++)
f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
3.第二种:二进制优化

样例可以表示为:
二进制优化核心代码:
int cnt=0;//计数器
for(int i=1;i<=n;i++)
{
int a,b,s;
cin>>a>>b>>s;
int k=1;
//二进制拆分
while(k<=s)
{
cnt++;
v[cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
}
if(s>0)//剩余
{
cnt++;
v[cnt]=a*s;
w[cnt]=b*s;
}
}
拆分完之后就变成了:
优化完之后在用一次01背包:
for(int i=1;i<=cnt;i++)
for(int j=m;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+w[i]);
cout<<f[m]<<endl;
4.第二种:单调队列优化<待写>
边栏推荐
猜你喜欢

7月HCIP Datacom认证考试通过

The difference between deadlock, hunger and dead cycle

ICML 2022 | sparse double decline: can network pruning also aggravate model overfitting?

Oralce中实现将指定列的指定内容替换为想要的内容

Origin of bean validation ----01

Mysql客户端到服务端字符集的转换

Three handling strategies of deadlock

快递单证智能OCR识别,助力物流行业数字化升级

Flutter | 指定页面回传值的类型

SOC的第一个Hello_World实验
随机推荐
Emgucv recording video
MySQL multi table query_ Inner connection_ Show internal connections
C#中单例模式的实现
JSP之自定义jstl标签
"1+1 > 10": potential combination of no code / low code and RPA Technology
Mysql—六大日志
Flutter | 给 ListView 添加表头表尾最简单的方式
Bean validation beginner ----02
Dark horse programmer - interface test - four day learning interface test - third day - advanced usage of postman, export and import of Newman case set, common assertions, assertion JSON data, working
AC automata and fail tree
Leetcode high frequency question: the array can be changed into a non descending state after at least several operations
Vinka introduces high anti-interference vk36n series touch IC: vk36n1d, vk36n2p, vk36n3b, vk36n4i, easy to use
单片机内部IO口保护电路及IO口电气特性以及为什么不同电压IO之间为什么串联一个电阻?
Kubernetes 基本概念和部署
pytest接口自动化测试框架 | 汇总
锁相环工作原理,比如我们8MHZ晶振如何让MCU工作在48MHZ或者72MHZ呢
GO语言学习——复习包、接口、文件操作
Why does fatal always appear when using opengaussjdbc? (tag database keyword user)
Oracle中实现删除指定查询条件的所有数据
为什么使用opengaussjdbc的时候老是出现FATAL?(标签-数据库|关键词-user)