首页 > 代码库 > NOIP提高组2006-金明的预算方案

NOIP提高组2006-金明的预算方案

链接

分析:依赖型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 }
View Code

 

NOIP提高组2006-金明的预算方案