每日一贴,今天的内容关键字为选择附件
/*
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1167
物品选择
Accepted : 13 Submit : 57
Time Limit : 1000 MS Memory Limit : 65536 KB
3 2
1 1
2 1
3 3
Source
duoxida
剖析:这是属于有依赖性的背包问题(参考背包2.7),
首先对其附件进行优化处置。即01背包处置,因为每种情况是不重复的
其次,将每组(包括主件i)看成是 v件物品,(k=1....v)其中每种物品占体积k,所得代价为c[k-1]+w[i](k-1,表现预处置得到附件最优解,再加上主件)
*/
#include<string.h> #include<stdio.h> #include<algorithm> #include <iostream> using namespace std; const int maxn=1000+10; int w[maxn],b[maxn]; int f[maxn]; int max(int a,int b) { return a>b? a:b; } int main() { int n,v; int i,j,k; int t1,t2; while(scanf("%d%d",&n,&v)!=EOF) { for(i=1;i<=n;i++) { scanf("%d%d",&w[i],&b[i]); } memset(f,0,sizeof(f)); for(i=1;i<=n;i++) if(b[i]==i)//找出主件 { memset(c,0,sizeof(c)); for(t2=1;t2<=n;t2++)//对附件进行01背包处置,使得在雷同体积下得到的代价最大 if(b[t2]==i&&b[t2]!=t2) {for(t1=v-1;t1>=0;t1--) if(t1-1>=0) c[t1]=max(c[t1],c[t1-1]+w[t2]); } c[v]=c[v-1]+w[i]; for(j=v;j>=0;j--) for(k=1;k<=v;k++)//此时看作相当于"V件物品",每件”物品体积“相当为'k',"代价为",c[k-1]+w[i],(i为主件) {if(j-k>=0) f[j]=max(f[j],f[j-k]+w[i]+c[k-1]); } } printf("%d\n",f[v]); } return 0; }
文章结束给大家分享下程序员的一些笑话语录:
神灯新篇
一个程序员在海滩上发现了一盏神灯。他在灯上擦了几下,一个妖怪就从灯里跳出来说:“我是世界上法术最强的妖怪。我可以实现你的任何梦想,但现在,我只能满足你一个愿望。”程序员摊开了一幅中东地图说:“我想让中东得到永久的和平。”妖怪答道:“哦,我没办法。自打创世纪以来,那里的战火就没有停息过。这世上几乎没有我办不到的事,但这件事除外。”程序员于是说:“好吧,我是一个程序员,为许多用户编写过程序。你能让他们把需求表述得更清楚些,并且让我们的软件项目有那么一两次按进度按成本完成吗?”妖怪说:“唔,我们还是来看中东地图吧。”
---------------------------------
原创文章 By
选择和附件
---------------------------------