分析:依赖型0-1背包问题,对于一个主件,可以挂0个,1个,2个附件,所以最终为4种状态情况下的最大值。
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=60+10; 7 const int maxm=32000+10; 8 int N,m; 9 int dp[maxm]; 10 int v1[maxn],p1[maxn],v2[maxn],p2[maxn]; 11 int v[maxn],p[maxn]; 12 int main() 13 { 14 cin>>N>>m; 15 for(int i=0;i<62;i++){ 16 v1[i]=0,p1[i]=0,v2[i]=0,p2[i]=0,v[i]=0,p[i]=0; 17 } 18 for(int i=1;i<=m;i++){ 19 int a,b,q; 20 cin>>a>>b>>q; 21 if(q!=0){ 22 if(v1[q]==0){ 23 v1[q]=a; 24 p1[q]=b; 25 }else{ 26 v2[q]=a; 27 p2[q]=b; 28 } 29 }else{ 30 v[i]=a; 31 p[i]=b; 32 } 33 } 34 int mx=0; 35 for(int i=1;i<=m;i++){ 36 for(int j=N;j>=v[i];j--){ 37 dp[j]=max(dp[j],dp[j-v[i]]+v[i]*p[i]); 38 if(j>=(v[i]+v1[i])) 39 dp[j]=max(dp[j],dp[j-v[i]-v1[i]]+v[i]*p[i]+v1[i]*p1[i]); 40 if(j>=(v[i]+v2[i])) 41 dp[j]=max(dp[j],dp[j-v[i]-v2[i]]+v[i]*p[i]+v2[i]*p2[i]); 42 if(j>=(v[i]+v1[i]+v2[i])) 43 dp[j]=max(dp[j],dp[j-v[i]-v1[i]-v2[i]]+v[i]*p[i]+v1[i]*p1[i]+v2[i]*p2[i]); 44 mx=max(mx,dp[j]); 45 } 46 } 47 cout<<mx<<endl; 48 }
时间: 2024-10-14 05:15:31