动态规划背包问题之多重背包详解
背包问题前几篇文章:
- 01背包详解
- 完全背包详解
文章目录
- 一、什么是多重背包问题?
- 二、例题分析
- 1. 题目:
- 2.第一种:朴素做法
- 3.第二种:二进制优化
- 4.第二种:单调队列优化<待写>
一、什么是多重背包问题?
有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.第二种:单调队列优化<待写>
动态规划背包问题之多重背包详解相关推荐
- 动态规划背包问题之01背包详解
文章目录 一.问题引入 1.什么是动态规划? 2.什么是背包问题? 3.什么是01背包? 4.背包问题怎么做? 二.例题讲解 1.题目: 2.分析 2.1 第一步:状态表示 2.2 第二步:确定状态转 ...
- 动态规划 —— 背包问题 P03 —— 多重背包
[题目] 有 N 种物品和一个容量为 V 的背包.第 i 种物品最多有 num[i] 件可用,每件体积是 w[i],价值是 c[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值 ...
- 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)
本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以 降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...
- WINME/WIN2000/LINUX多重启动详解(4年前写的,不知道现在还有没有用)
WINME/WIN2000/LINUX多重启动详解 张仁惠 (Harbin 2001.3 http://www.filesee.com) 目前由于硬盘和内存价格的不断下降,很多朋友的电脑都是大硬盘,内 ...
- 九十、动态规划系列背包问题之多重背包
@Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...
- 古有陈天华万字血书抗沙俄,今有本剧蒻万字背包虐dp(01,完全,多重,分组,混合等各种背包详解 + 板子题+ 奇奇怪怪滴变式题)
前言: 本文介绍了01背包.完全背包.多重背包.混合背包.分组背包等背包,并对其进行透彻的剖析,并附上了板子题,供您白嫖,以及一些奇葩变式,颇有意思,供你琢磨玩弄.此外绝大部分题都有二维数组和滚动数组 ...
- 各种背包详解(自己总结) 金明的预算和LOL(可依赖的背包问题)
在讲可依赖背包之前先回顾下背包九讲的内容,现在做dp多了发现背包问题真的是dp的鼻祖,好多种问题都是基于背包的模型发展而来,就是不是基于背包的,把背包搞懂也有利于你自己学习dp,以此来想到其它状态转移 ...
- 背包详解:完全背包与多重背包
目录 完全背包 优化一:输入优化 优化二:二进制 优化三:重复放入的 01 背包 多重背包 总结 完全背包 有一个大小为 m 的背包,有 N 种物体,每种物品的价值为 Vi, 大小为 Ai, 并且每种 ...
- 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)
@Author:Runsen @Date:2020/9/17 多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤.在多重背包的问题,其实更多的是考查多重背包的二进制优化方法.学习二进制优化 ...
最新文章
- Masking GAN pytorch
- python另一个程序正在使用此文件_另一个程序正在使用此文件,进程无法访问
- 手动选择显示_为什么考驾照的人多数选择C1而不是C2?老教练说出了真相....
- 一点总结,手机应用开发前景
- docker配置深度学习环境
- Qt——菜单栏、工具栏、状态栏
- (最通俗易懂的)目标跟踪MOSSE、KCF
- C语言输出九九乘法口诀表
- 面试常见的逻辑推理题
- 检测图书ISBN编号校检位
- ORACLE索引分裂(enq: TX - index contention)
- 横跨十年CPU架构回顾
- NOIP2017大总结
- cross_val_score的 scoring参数值解析
- OUC离散数学II实验二(Python+Cpp)
- 什么是网络免费2.0?
- VIVO Y30标准版PD2036A强制线刷,亲测可过
- 全志H6方案板香橙派OrangePi 3开发板26pin GPIO口测试
- 01-pie小游戏(基本图形的绘制)
- 华为鸿蒙手机有哪几款,华为哪款手机搭载鸿蒙?_科技数码通
热门文章
- 滴滴顺风车下线整改325天 这款产品变成什么样了?
- c++ std::timed_mutex 有时限锁定
- 【hd水题】hd2018 母牛的故事
- python字符串,列表,元组,字典的基本操作
- 华为手机双卡有android,安卓卡慢?余承东:国内或只有华为能解决
- spring aop中pointcut表达式
- 十个“三角形”汉字,好看、不好认
- java之Pattern类详解
- 区块链与大数据有着怎样的关系?
- 【arduino】米思齐Mixly模块编写修改方法,非常简单的Mixly模块修改方法