午餐费
题目描述
现要对某班学生进行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;
}