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

NOIP2006 金明的预算方案

时间:2018-04-16 21:08:09      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:背包   col   pre   lse   pac   using   clu   sum   数组   

金明的预算方案

 

显然是个背包问题

把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法:

1.都不选

2.只选主件

3.一个主件+一个附件

4.一个主件+两个附件

 

于是就成了01背包。。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,f[32010],v[65][4],w[65][4],pos[65]; //pos[i]记录编号为i的物品在数组v,w中的下标 
                            //w[i][0]表示第i个主件的附件个数
6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 int V,P,Q,sum; 10 for(int i=1;i<=m;i++) 11 { 12 scanf("%d%d%d",&V,&P,&Q); 13 if(Q==0) 14 { 15 v[++sum][1]=V; 16 w[sum][1]=P; 17 pos[i]=sum; 18 } 19 else 20 { 21 w[pos[Q]][++w[pos[Q]][0]+1]=P; 22 v[pos[Q]][w[pos[Q]][0]+1]=V; 23 } 24 } 25 for(int i=1;i<=sum;i++) 26 for(int j=n;j>=v[i][1];j--) 27 { 28 f[j]=max(f[j],f[j-v[i][1]]+w[i][1]*v[i][1]); 29 if(w[i][0]>=1&&j-v[i][1]-v[i][2]>=0) 30 f[j]=max(f[j],f[j-v[i][1]-v[i][2]]+w[i][1]*v[i][1]+w[i][2]*v[i][2]); 31 if(w[i][0]==2&&j-v[i][1]-v[i][3]>=0) 32 { 33 f[j]=max(f[j],f[j-v[i][1]-v[i][3]]+w[i][1]*v[i][1]+w[i][3]*v[i][3]); 34 if(j-v[i][1]-v[i][2]-v[i][3]>=0) 35 f[j]=max(f[j],f[j-v[i][1]-v[i][2]-v[i][3]]+w[i][1]*v[i][1]+w[i][2]*v[i][2]+w[i][3]*v[i][3]); 36 } 37 } 38 printf("%d\n",f[n]); 39 return 0; 40 }

 

NOIP2006 金明的预算方案

标签:背包   col   pre   lse   pac   using   clu   sum   数组   

原文地址:https://www.cnblogs.com/yjkhhh/p/8858479.html

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