混合背包问题

混合背包问题

![在这里插入图片描述]( https://img-blog.csdnimg.cn/5c618df2368c4eff8e6f5289fd2069b3.png?x-oss-process=image/watermark ,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUGFuc2XCtw==,size_20,color_FFFFFF,t_70,g_se,x_16)
样例输入:

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;
}

 

posted @ 2022-03-22 14:21  panse·  阅读(34)  评论(0)    收藏  举报