top1编程
← 返回题目
题解

【提高】多重背包(2)

1 条题解

  • 0
    @ 2026-7-29 0:18:07
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int N,V;
    	cin>>N>>V;
    	int v1,w1,s1,sum=0;
    	int v[10100]={},w[10100]={};
    	for(int i=1;i<=N;i++){
    		cin>>v1>>w1>>s1;
    		//把v1,w1,s1分成1,2,4,8....的类型
    		int k=1;
    		while(k<=s1){
    			v[++sum]=v1*k;
    			w[sum]=w1*k;
    			s1-=k;
    			k*=2;
    		}
    		if(s1){
    			v[++sum]=v1*s1;
    			w[sum]=w1*s1;
    		}
    	}
    	int dp[sum+1][V+1]={};
    	for(int i=1;i<=sum;i++){
    		for(int j=1;j<=V;j++){
    			if(j<v[i]){
    				dp[i][j]=dp[i-1][j];
    			}else{
    				dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
    			}
    		}
    	}
    	cout<<dp[sum][V];
    	return 0;
    }
    
    • 1