比赛 国庆欢乐赛2 评测结果 TAAAAAAAATTTTTTTATTT
题目名称 毛一琛 最终得分 45
用户昵称 对立猫猫对立 运行时间 35.535 s
代码语言 C++ 内存使用 3.50 MiB
提交时间 2025-10-04 10:08:17
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for(register int i = a; i <= b; i++)
using namespace std;
int n, m[105];
int ans = 0;
bool vis[105];
bool dfs2(int nowsum, int idx, int goal) {
	if(nowsum > goal) return false;
	if(idx == n + 1) {
		if(nowsum == goal) return true;
		return false;
	}
	else {
		if(!vis[idx]) return dfs2(nowsum, idx + 1, goal);
		else {
			if(dfs2(nowsum, idx + 1, goal)) return true;
			else return dfs2(nowsum + m[idx], idx + 1, goal);
		}
	}
}
void dfs(int idx, int nowcnt, int nowsum) {
	if(idx == n + 1) {
		if(nowcnt <= 1) return;
		if(nowsum & 1) return;
		else {
//			int t = lower_bound(m + 1, m + n + 1, sum >> 1) - m;
//			int mid = sum >> 1;
//			for(int i = t; i >= 1; i--) {
//				if(mid >= m[i] && vis[i]) mid -= m[i];
//			}
//			if(mid) return;
			if(!dfs2(0, 1, nowsum >> 1)) return;
			else {
//				for(int i = 1; i <= n; i++) {
//					if(vis[i]) cout << m[i] << " ";
//				}
//				cout << endl;
				ans++;
			}
		}
		return;
	}
	else {
		vis[idx] = 1;
		dfs(idx + 1, nowcnt + 1, nowsum + m[idx]);
		vis[idx] = 0;
		dfs(idx + 1, nowcnt, nowsum);
	}
}
signed main() {
	freopen("subsets.in", "r", stdin);
	freopen("subsets.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
	For(i, 1, n) cin >> m[i];
	sort(m + 1, m + 1 + n);
//	For(i, 2, n) {
//		m[i] -= m[1];
//		m[i]++;
//	}
//	m[1] = 1;
	dfs(1, 0, 0);
	cout << ans << endl;
	return 0;
}