混合背包问题
混合背包问题

样例输入:
4 5
1 2 -1
2 4 1
3 4 0
4 5 2
样例输出:
8
代码模板:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2e4+5;
int n,V,f[N];
int main(){
cin>>n>>V;
for(int i=1;i<=n;i++)
{
int v,w,s;
cin>>v>>w>>s;
if(s==0){//完全背包问题
for(int j=v;j<=V;j++) f[j]=max(f[j],f[j-v]+w);
}else{
if(s==-1) s=1;
for(int k=1;k<=s;k*=2){
for(int j=V;j>=v*k;j--)
f[j]=max(f[j],f[j-k*v]+k*w);
s-=k;
}
if(s>0)
for(int j=V;j>=v*s;j--)
f[j]=max(f[j],f[j-s*v]+s*w);
}
}
cout<<f[V]<<endl;
return 0;
}

浙公网安备 33010602011771号