萌新不会爆搜,改了几个小时只有30分。后来加了个卡时能到80了,剩下有一个点答案只差了1。 要崩溃哩,球球帮帮孩子吧QAQ
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define ll long long
#include<cstdlib>
using namespace std;
const int N=1e5+10;
int n,c,a[N],b[N];//b数组存可选的数 数组是递减的
ll ans;
int flag[N];//标记数组,防死循环
void dfs(int x,ll sum,int step){
// if(sum>1ll*c)return ;
// if(flag[1]>1e8){
// printf("%d",ans);
// exit(0);
// }
for(int i=x;i>=1;i--){
if(sum+a[i]>c)continue;// 剪枝
if(step>=2&&a[i]+b[step]>b[step-1])continue;//剪枝
if(flag[1]>10*N)return;//卡时
flag[i]++;
b[++step]=a[i];
ans=max(ans,sum+1ll*a[i]);
dfs(i-1,sum+a[i],step);
}
return ;
}
int main(){
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=n;i>1;i--){
if(a[i]==c){
printf("%d",c);
return 0;
}
if(a[i]<c){
memset(flag,0,sizeof(flag));
flag[i]++;
b[1]=a[i];
dfs(i-1,a[i],1);
}
}
printf("%lld",ans);
return 0;
}