午餐费

题目描述

现要对某班学生进行N天培训,该班所有学生都订了N天的午餐,所以我们知道他们每天要花多少钱。现在该班班主任需要决定如何使用班费。由于钱有限,他们不可能每天都吃免费午餐。因此,每天班主任可以选择自己支付或使用班费支付当天午餐费。当然,班主任比较小气,希望尽可能多地花掉班费,但是他太忙了,请你帮他计算他最多能够花多少班费。

输入格式

输入包含多个测试数据(不超过50个)。

每个测试数据有两行。第一行有两个整数,N为培训天数,M为班费总数。

第二行包含N个正整数,其中第i个整数表示该班当天需要支付第午餐的钱。所有这些整数都不超过10000000,整数之间用空格分隔。

输出格式

对于每个测试数据,输出一行整数,表示班主任能够花班费的最大金额

样例

样例输入

3 10
8 4 5

样例输出

9

c++AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[35],sum,ans[35];
inline void dfs(int num,int tot){
	if(num>m)return;
	if(num+ans[tot]<=sum)return;
	if(tot==n+1){
		sum=max(num,sum);
		return;
	}
	dfs(num+a[tot],tot+1);
	dfs(num,tot+1);
}
bool cmp(int x,int y){return x>y;}
int main(){
	freopen("lunch.in","r",stdin);
	freopen("lunch.out","w",stdout);
	while(scanf("%d %d",&n,&m)!=EOF){
		for(int i=1;i<=n;i++)scanf("%d",&a[i]);
		sort(a+1,a+1+n,cmp);
		for(int i=n;i>=1;i--)ans[i]=ans[i+1]+a[i];
		dfs(0,1);
		printf("%d\n",sum);
		sum=0;
	}
	return 0;
}
 
posted @ 2021-03-13 14:55  黄逸飞重庆八中  阅读(128)  评论(0编辑  收藏  举报