题目大意
给出n个数,保证这n个数是一个不下降序列
给定一个c,求n个数中,在不超过c的情况下的最大组合的值
题目解析
递归暴力+前缀和优化
从最大的开始搜,可以更快的超过c,跳出dfs
代码
#include<bits/stdc++.h>
using namespace std;
long long n,c,ans;
long long w[50],sum[50];
void dfs(long long lev,long long t)
{
if(t>c) return;
if(sum[lev-1]+t<=c)
{
ans=max(ans,sum[lev-1]+t);
return;
}
ans=max(ans,t);
for(int i=1;i<=lev-1;i++)
dfs(i,t+w[i]);
return;
}
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
cin>>w[i],sum[i]+=sum[i-1]+w[i];
dfs(n+1,0);
cout<<ans;
}