思路:看题数据范围就表示背包不可能,那么仔细看看发现实际上n的个数最多只有40个,那么dfs就是可取的。但是需要考虑剪枝否则也会T,有以下几点:
1.它是递增排列的求最大值,那么我们可以从后向前dp,同时如果数据大于K时可以不录入减少N的个数。
2.采取前缀和,如果前面所有的sum【i】加和都小于目前的最大值,那么便也没有继续往下搜索的必要了。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include <stack>
#define LL long long
using namespace std;
const int N = 1e6 + 10;
LL ite[1001],k,maxn,sum[50];
int n;
void dfs(int t,LL ans){
if(t<1||ans+ite[1]>k) return;
if(sum[t]+ans<maxn) return;
if(sum[t]+ans<=k) {
maxn=max(maxn,sum[t]+ans);
}
for(int i=t;i>=1;i--){
if(ans+ite[i]<=k){
dfs(i-1,ans+ite[i]);
maxn=max(maxn,ans+ite[i]);
}
}
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>ite[i];
if(ite[i]>k){
n=i-1;
break;
}
}
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+ite[i];
}
dfs(n,0);
cout<<maxn;
return 0;
}