码迷,mamicode.com
首页 > 其他好文 > 详细

P1064 金明的预算方案

时间:2020-03-23 20:48:01      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:pac   c++   using   code   alt   closed   ons   class   max   

题意:给出一个限定金额n,给出m个物品,m个物品可能有依赖关系

    但只能有一层:一个物品,要么是主件,要么是附件

      每个物品有价格和重要值,每个物品的最终贡献是价格*重要值

        求在n金额的限定下能够得出的最大贡献是多少

          好久没做,这好像是分组背包??

            忘记了。

思路:将有依赖关系的放在一组,然后遍历像01背包那样逐一遍历

    但又区别于01背包,因为我们遍历一组背包时,它里面可能有1 2 3 个物品    

      所以我们又要注意遍历这几件物品(但是有一个前提,就是必须包含主件)

        那么组合有(主件+附件1)或者(主件+附件2)或者(主件+附件1+附件2)或者(主件)

          那么一组背包里可能没有附件1  或者附件1 2 都没有,那么这样写可以嘛?

            可以,就当作附件1或者附件2是w v都为0即可

代码如下:

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=32100;
 4 int dp[maxn];
 5 int Goodsw[maxn][3];
 6 int Goodsv[maxn][3];
 7 int w[maxn];int v[maxn];
 8 int main()
 9 {
10     int n,m;
11     scanf("%d%d",&n,&m);
12     for(int i=1;i<=m;i++){
13         int t1,t2,t3;
14         scanf("%d%d%d",&t1,&t2,&t3);
15         if(!t3){
16             w[i]=t1;
17             v[i]=t1*t2;
18         }
19         else{
20             Goodsw[t3][0]++;
21             Goodsw[t3][Goodsw[t3][0]]=t1;
22             Goodsv[t3][Goodsw[t3][0]]=t1*t2;
23         }
24     }
25     for(int i=1;i<=m;i++){
26         for(int j=n;j>=w[i];j--){
27             dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
28             if(j>=Goodsw[i][1]+w[i])
29                 dp[j]=max(dp[j],dp[j-w[i]-Goodsw[i][1]]+v[i]+Goodsv[i][1]);
30             if(j>=Goodsw[i][2]+w[i])
31                 dp[j]=max(dp[j],dp[j-w[i]-Goodsw[i][2]]+v[i]+Goodsv[i][2]);
32             if(j>=Goodsw[i][1]+w[i]+Goodsw[i][2])
33                 dp[j]=max(dp[j],dp[j-w[i]-Goodsw[i][1]-Goodsw[i][2]]+v[i]+Goodsv[i][2]+Goodsv[i][1]);
34         }
35     }
36     printf("%d\n",dp[n]);
37     return 0;
38 }
View Code

 

P1064 金明的预算方案

标签:pac   c++   using   code   alt   closed   ons   class   max   

原文地址:https://www.cnblogs.com/pangbi/p/12554538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!