对于dd大牛《背包九讲》的总结——第三讲多重背包问题以及优化

背包哪九讲?
1.01背包问题——每件物品选或者不选
2.完全背包问题——每件物品可以选无限次,爱选多少次选多少次,只要背包容量够用
3.多重背包问题——每个物品选的次数上限不同且有限制
4.混合背包问题——物品很多种,每种物品的信息不同
5.二维费用背包问题——普通的背包问题可能只有重量限制,而二维可能是重量+体积限制
6.分组背包问题——各种问题分成若干组,每组只能选一件,组内物品相互排斥
7.背包问题求方案数
8.求背包问题方案
9.有依赖的背包问题

第三讲多重背包问题
题目:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

基本算法:这题目和完全背包问题很像。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件,取2件…取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:
f[i][v]=max(f[i-1][v-k *c[i]]+k *w[i]|0<=k<=n[i])
复杂度是O(V *∑n[i])。

#include
#include
using namespace std;
const int MAX=1010;
int N,V;
int f[MAX];
int c[MAX],w[MAX],s[MAX]; //费用和价值 
int main()
{
	cin>>N>>V;
	for(int i=1;i<=N;i++)
		cin>>c[i]>>w[i]>>s[i];
	for(int i=1;i<=N;i++)//N件物品
		for(int v=V;v>=c[i];v--)//背包容量——所剩费用,和01背包一样,从V到0
		    for(int k=1;k<=s[i]&&k*c[i]<=v;k++)
		        f[v]=max(f[v],f[v-k*c[i]]+k*w[i]);
	cout<

转化为01背包问题:把第i种物品转换成n[i]件01背包中的物品,则得到了物品数为∑n[i]的01背包问题,直接求解,复杂度仍然是O(V* ∑n[i])。
但是我们希望的是将它转为01背包问题之后能够像完全背包问题一样降低复杂度。仍然需要考虑二进制的思路,我们考虑把第i种物品换成若干件物品,使得原问题中第i种物品可取的每种策略——取0…n[i]件——均能等于去若干件代换以后的物品。另外,取超过n[i]件的策略必不能出现。
方法:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为1,2,4,…,2(k-1),n[i]-2k+1,且k是满足n[i]-2k+1>0的最大整数。例如,如果n[i]=13,就将这种物品分成系数分别为1,2,4,6的事件物品。
分成的这几件物品的系数和为n[i],表明不可能取多于n[i]件的第i种物品。另外这种方法也能保证对于0…n[i]间的每一个整数,均可以用若干系数的和表示。
这样就将第i种物品分成了O(log n[i])种物品,将原问题转化为了复杂度为O(V*Σlog n[i])的01背包问题,是很大的改进。

#include
#include
#include
using namespace std;
const int MAX=2010;
int N,V;
int f[MAX];
int c,w,s; //费用和价值 
struct Good
{
    int c,w;
};
int main()
{
    vector goods;
	cin>>N>>V;
	for(int i=1;i<=N;i++)
	{	cin>>c>>w>>s;
	    for(int k=1;k<=s;k=k*2)
	    {   s=s-k;
	        goods.push_back({c*k,w*k});
	    }
	    if(s>0)
	        goods.push_back({c*s,w*s});
	}
	for(auto good:goods)//N件物品
		for(int v=V;v>=good.c;v--)//背包容量——所剩费用,和01背包一样,从V到0
		        f[v]=max(f[v],f[v-good.c]+good.w);
	cout<

多重背包问题同样有O(VN)的算法:这个算法基于基本算法的状态转移方程,但应用单调队列的方法使每个状态的值可以以均摊O(1)的时间求解。由于用单调队列优化的DP已超出了NOIP的范围,故本文不再展开讲解,这个方法是在楼天成的“男人八题”幻灯片上。

你可能感兴趣的:(背包九讲)