背包

背包

1.二维01背包

for(int i = 1;i <= m;i++)//枚举物品数量
    for(int j = w[i];j <= n;j++)//枚举背包空间
       if(j >= w[i]) f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
ans:f[m][n]

2.一维01背包

for(int i = 1;i <= m;i++)
    for(int j = n;j >= w[i];j--)
        f[j] = max(f[j],f[j-w[i]]+v[i]);//f[w]代价不超过w的最大价值
ans:f[n]

3.完全背包 一维

for(int i = 1;i <= n;i++)
    	for(int j = w[i];j <= T;j++)//正序
            f[j] = max(f[j],f[j-t[i]]+v[i])

4.多重背包

朴素:

for(i=1->n)
    for(j=1->w)
        for(k=1>m[i])
f[j] = max{f[j-k*w[i]]+k*v[i]}//伪代码

二进制优化:\(O(nWlogm)\)\(logn*n\)个数组

for(int i = 1;i <= n;i++){
		scanf("%d%d%d",&x,&y,&z);//价值重量数量
		for(int j = 1;j <= z;j<<=1)
		v[++cnt] = x*j,w[cnt] = y*j,z -= j;
		if(z) v[++cnt] = x*z,w[cnt] = y*z;
	}//拆分
for(int i=1;i<=cnt;i++)
		for(int j=m;j>=w[i];j--)
			f[j]=max(f[j],f[j-w[i]]+v[i]);//01包板子

单调队列优化:\(O(nW)\)

先咕着
posted @ 2020-08-14 07:29  INFP  阅读(120)  评论(0编辑  收藏  举报