top1编程
← 返回题目
题解

【提高】混合背包

1 条题解

  • 0
    @ 2026-7-29 0:18:11
    #include<bits/stdc++.h>
    using namespace std;
    int f[1005];
    int main(){
        int N,V;
        scanf("%d%d",&N,&V);
        for(int i=1;i<=N;i++){
            int v,w,s;
            scanf("%d%d%d",&v,&w,&s);
            if(s==-1){
                for(int j=V;j>=v;j--)
                    f[j]=max(f[j],f[j-v]+w);
            }else if(s==0){
                for(int j=v;j<=V;j++)
                    f[j]=max(f[j],f[j-v]+w);
            }else{
                int k=1;
                while(k<=s){
                    for(int j=V;j>=k*v;j--)
                        f[j]=max(f[j],f[j-k*v]+k*w);
                    s-=k;
                    k*=2;
                }
                if(s>0){
                    for(int j=V;j>=s*v;j--)
                        f[j]=max(f[j],f[j-s*v]+s*w);
                }
            }
        }
        printf("%d",f[V]);
        return 0;
    }
    
    • 1