求助,P1120小木棍,最后一个点T了
查看原帖
求助,P1120小木棍,最后一个点T了
601968
Vibration886楼主2022/10/7 16:22

最后一个点TLE了啊

本蒟蒻把所有可以想到的剪枝方法都用上了,还可以怎么优化?

#include <bits/stdc++.h>
using namespace std;
int N,a[80],book[80],maxn,sum,len;
bool cmp(int x,int y)
{
	return x>y;
}
bool dfs(int cnt,int rest,int now)
{
	if(cnt==sum/len)
	{
		return true;
	}
	if(rest==0)
	{
		return dfs(cnt+1,len,1);
	}
	for(int i=now;i<=N;i++)
	{
		if(!book[i]&&a[i]<=rest)
		{
			book[i]=1;
			if(dfs(cnt,rest-a[i],i+1))
			{
				return true;
			}
			book[i]=0;
			if(rest==len||a[i]==rest)
			{
				return false;
			} 
			while(a[i]==a[i+1])
			{
				i++;
			}
		}
	}
	return false;
}
int main()
{
	cin>>N;
	for(int i=1;i<=N;i++)
	{
		cin>>a[i];
		maxn=max(maxn,a[i]);
		sum+=a[i];
	}
	sort(a+1,a+N+1,cmp);
	for(len=maxn;len<=sum;len++)
	{
		if(sum%len==0)
		{
			if(dfs(0,len,1))
			{
				cout<<len;
				break;
			}
		}
	}
	return 0;
}
2022/10/7 16:22
加载中...