[百度2015春季实习生招聘附加题] 今天要吃点好的!

题目地址:http://www.nowcoder.com/questionTerminal/a3544f370fb2409aa09a7a214e9c9551?orderByHotValue=1&done=0&pos=6

加班了一个通宵的度度熊,神经有点恍惚,想到依然未能解决的Bug,眼泪禁不住霹雳哗啦往下掉……他抬头看了看帝都灰蒙蒙的天空,一咬牙,一跺脚,大叫一声——劳资今天要吃点好的! 已知本厂有n个食堂,第i(i属于[1,n])个食堂有m[i]种食物,每种食物有一个价钱c,享受度v,度度熊希望去一个食堂就餐,花费[bot,top]范围内的钱数(也可以拍桌子走人,哪里都不吃了),选择若干种食物,使得自己所能获得的享受度最大。(注意,度度熊还有一个挑食的特点,同一种食物他最多只会点一份。) 现在告诉你所有食堂食物的信息,希望你进行选择搭配,使得度度熊可以得到最大的享受度,并输出这个享受度的值。 

输入描述:
第一行是一个正整数T(1<=T<=20),表示有T组测试数据。
对于每组数据——
第一行是三个数n,bot,top,n代表食堂数1<=n<=10),bot是这次吃饭的最低消费,top是这次吃饭的最高消费(0<=bot,top<=10000)
接下来依次是n个食堂的信息,对于第i个食堂
第一行是一个数m[i](o<=m[i]<=100),代表第i个食堂的食物数
第二行有2*m[i]个数,分别是c[i][1],v[i][1],c[i][2],v[i][2],……c[i][m[i]],v[i][m[i]]
c[i][j]表示第i个餐厅第j种食物的价钱,v[i][j]代表第i个餐厅第j种食物给度度熊带来的享受度。
输出描述:
对于每组数据,请输出一行,每行一个正整数。表示度度熊所能获得的最大享受度。
数据结果保证不会超过2^31-1.
输入例子:
2
2 10 20
5 1 1 2 1 5 1 10 1 20 1
5 1 2 2 2 5 2 10 2 20 2
2 10 10
1 5 1
1 5 1
输出例子:
8
0


题解:

   首先度度熊只可能去一个餐厅用餐,所以每组数据中的每个餐厅可以独立解答。
     根据数据规模o<=m[i]<=100 ;0<=bot,top<=10000,所以想到动态规划,转化为背包问题。因为花费必须在bot~top之间,即相当于物品体积至少装到bot,所以改变一下初始化,开一个二维数组f[i][j],代表装第i个物品,花费j元时的最大享受度。

  对于每个餐厅初始化f[i][j]=-1;f[0][0]=0;则动态转移方程if(f[i][j]!=-1) f[i][j+c]=max(f[i-1][j+c],f[i-1][j]+v);最后扫描一下f[n][bot~top]取最大值即可。另外,可以利用滚动数组进行优化,去掉一维。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<math.h>
 6 #include<stdbool.h>
 7 #include<time.h>
 8 #include<stdlib.h>
 9 #include<set>
10 #include<map>
11 #include<stack>
12 #include<queue>
13 #include<vector>
14 using namespace std;
15 #define clr(x,y)    memset(x,y,sizeof(x))
16 #define sqr(x)      ((x)*(x))
17 #define all(it,s)   for(it=s.begin();it!=s.end();it++)
18 #define rep(i,a,b)  for(int i=(a);i<=(b);i++)
19 #define LL          long long
20 #define INF         0x3f3f3f3f
21 #define A           first
22 #define B           second
23 #define PI          acos(-1.0)
24 int f[11000];
25 
26 int main()
27 {
28     int T,n,h,t,k,c,v,maxn;
29     
30     scanf("%d",&T);
31     while(T--) {
32         scanf("%d%d%d",&n,&h,&t);
33         maxn=-1; 
34         while(n--) {
35             scanf("%d",&k);
36             clr(f,-1);
37             f[0]=0;
38             for(int i=0;i<k;i++) {
39                 scanf("%d%d",&c,&v);
40                 for(int j=t;j>=c;j--) {
41                     if(f[j-c]!=-1) {
42                         f[j]=max(f[j],f[j-c]+v);
43                     }
44                 }
45             }
46             for(int i=h;i<=t;i++) {
47                 maxn=max(maxn,f[i]);
48             }
49         }
50         if(maxn==-1) puts("0");
51         else printf("%d\n",maxn);  
52     }
53  
54 }

 

 
posted @ 2015-04-23 14:40  SXISZERO  阅读(370)  评论(0编辑  收藏  举报