题解
【提高】多重背包(2)
1 条题解
-
0
#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