多重背包问题是对物品的数目有了限制 并且加强了数据
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;
}