所有优化都试了,还差8ms,求优化谢谢!
  • 板块P1120 小木棍
  • 楼主Pianmu
  • 当前回复16
  • 已保存回复16
  • 发布时间2023/7/14 21:01
  • 上次更新2023/11/3 09:48:58
查看原帖
所有优化都试了,还差8ms,求优化谢谢!
929763
Pianmu楼主2023/7/14 21:01
# include <bits/stdc++.h>
using namespace std;
const int maxn=66;
int a[maxn];
int n,tot=0,now,last_one,ans;
bool vis[maxn];
bool cmp(int x,int y)
{
	return x>y;
}
bool dfs(int num,int len)
{
	if(num==0&&len==0) return 1;
	if(len==0) len=now;
	int begin=1;
	if (len!=now) begin=last_one+1;
	for (int i=begin;i<=n;i++)
	{
		if (!vis[i]&&a[i]<=len)
		{
			if (i!=1&&!vis[i-1]&&a[i-1]==a[i])
				continue;
			vis[i]=true;
			last_one=i;
			if (dfs(num-1,len-a[i]))
			{
				return 1;
			}
			vis[i]=false;
			if (len==a[i]||len==now)
				return 0;
		}
	}
	return 0;
}
int main()
{
		tot=0;ans=0;
		scanf("%d",&n);
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			tot+=a[i];
		}
		sort(a+1,a+n+1,cmp);
		for (int i=a[1];i<=(tot>>1);i++)
		{
			if (tot%i)
			{
				continue;
			}
			last_one=1;
			now=i;
			//memset(vis,false,sizeof(vis));
			if(dfs(n,i))
			{
				ans=i;
				break;
			}
		}
		if(ans) printf("%d\n",ans);
		else printf("%d\n",tot);
	return 0;
}
2023/7/14 21:01
加载中...