P1064 金明的预算方案
Posted pangbi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1064 金明的预算方案相关的知识,希望对你有一定的参考价值。
题意:给出一个限定金额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 ",dp[n]); 37 return 0; 38 }
以上是关于P1064 金明的预算方案的主要内容,如果未能解决你的问题,请参考以下文章