比赛 |
国庆欢乐赛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;
}