不会爆搜,80分求助!
查看原帖
不会爆搜,80分求助!
515833
tang_mx楼主2023/7/26 12:13

萌新不会爆搜,改了几个小时只有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;
}
2023/7/26 12:13
加载中...