多重背包问题-笔记

多重背包问题是对物品的数目有了限制 并且加强了数据
n2复杂度会超时 所以使用二进制优化

一般数据俩循环就能AC
不过>10000则费劲了,


需要用二进制优化 ,如下:
7 = 2^0 + 2^1 + 2^2

这样只需循环3次 大大缩减了时间复杂度。

#include <iostream>
#include <vector>
using namespace std;
int N,V;
int f[2010];  //dp用
struct node{  //存体积 价值
	int v,w;
};


int main()
{
	vector<node> goods;
	cin>>N>>V;
	for(int i=0;i<N;i++){
		int v,w,s;
		cin>>v>>w>>s;
		for(int j=1;j<=s;j*=2) //二级制优化log n 
		{
			s-=j;
			goods.push_back({v*j,w*j});
		}
		if(s>0)goods.push_back({v*s,w*s}); //优化后 剩余的S加入
	}  //这里用的迭代器DEV会警告 看别人用的是c++11的auto:goods  但是蓝桥杯不支持c++11 
	for(vector<node>::iterator it = goods.begin();it!=goods.end();it++){
		for(int j = V;j>=it->v;j--)
			f[j] = max(f[j],f[j-it->v]+it->w);
	} 
	cout<<f[V]<<endl;
}

猜你喜欢

转载自blog.csdn.net/zhimeng_LQ/article/details/105589995