30pts求助
  • 板块P1120 小木棍
  • 楼主Chr0n1CleC
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/20 21:36
  • 上次更新2023/10/24 07:05:20
查看原帖
30pts求助
701221
Chr0n1CleC楼主2022/12/20 21:36
#include<cstdio>
#define N 79

inline int read()
{
	register int ret = 0;
	register bool f = 1;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		(ch == '-') ? f = 0 : 0, ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return f ? ret : -ret;
}

int a[N], sum, n = read();

bool vis[N];

bool ans;

int tot;

void dfs(register int cnt, register int kkk)
{
	if (ans)
		return;
	if (cnt == kkk)//刚刚相等
	{
		register int i;
		if (tot == n)
		{
			ans = 1;
			return;
		}
		for (i = n;i;-- i)
			if (!vis[i])
			{
				vis[i] = 1;
				++ tot;
					dfs(a[i], kkk);
				vis[i] = 0;
				-- tot;
			}
		return;
	}
	if (ans)
		return;
	register int i;
	for (i = 1;i <= n;++ i)
	{
		if (ans)
			return;
		if (a[i] + cnt > kkk)
			break;
		if (!vis[i])
		{
			++ tot;
			vis[i] = 1;
			dfs(cnt + a[i], kkk);
			if (ans)
				return;
			vis[i] = 0;
			-- tot;
			if (!cnt || cnt + a[i] == kkk)
				break;
		}
	}
	
}

#include<algorithm>

#define max(a, b) (a > b ? a : b)

int main()
{
	register int i(1), mx(0), kkk;
	for (;i <= n;++ i)
		a[i] = read(), sum += a[i], mx = max(mx, a[i]);//记录sum,答案一定是sum的因数
	std::sort(a + 1, a + 1 + n);
	for (kkk = mx;kkk <= sum;++ kkk)//枚举因数
	{
		if (sum % kkk == 0)
		{
			tot = 0;
			for (i = 1;i <= n;++ i)
				vis[i] = 0;
			dfs(0, kkk);
			if (ans)//如果有答案
			{
				printf("%d", kkk);//输出
				return 0;
			}
		}
	}
	
	return 0;
}
2022/12/20 21:36
加载中...