百度试题:度度熊

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


输入描述:
第一行是一个正整数T1<=T<=20),表示有T组测试数据。
对于每组数据——
第一行是三个数nbottopn代表食堂数1<=n<=10),bot是这次吃饭的最低消费,top是这次吃饭的最高消费(0<=bottop<=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

 

思路:01背包问题

#include<iostream>
#include<vector>
#include<limits.h>

using namespace std;

int fmaxEnj(int NumOfFood,int bot,int top,vector<int>& vec)//01package problem
{
	vector<int> f(top+1,0);
	if(bot==top)//need to be full
	{
		for(int i=1;i<top+1;++i)
		{
			f[i]=INT_MIN;
		}
	}

	for(int i=1;i<=NumOfFood;++i)
	{
		for(int v=top;v>=vec[(i-1)*2];--v)
		{
			f[v]=max(f[v],f[v-vec[(i-1)*2]]+vec[(i-1)*2+1]);
		}
	}
	return f[top];
}

int main()
{
	int n,bot,top;
	int timesOfCase;
	cin>>timesOfCase;
	while(timesOfCase>0)//time of Case
	{
		int maxEnj=0;
		timesOfCase--;
		cin>>n>>bot>>top;
		while(n>0)//number of eatery
		{
			int NumOfFood;
			cin>>NumOfFood;
			vector<int> vec(NumOfFood*2,0);
			for(int i=0;i<NumOfFood*2;++i)
			{
				cin>>vec[i];
			}

			int tmp=fmaxEnj(NumOfFood,bot,top,vec);
			maxEnj=tmp>maxEnj?tmp:maxEnj;//keep the maximum of enjoy
			n--;
		}
		cout<<maxEnj<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值