题目描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
输入格式
集合中的元素(元素<=1000)
输出格式
和
输入输出样例
输入 #1
2 3
输出 #1
10
说明/提示
子集为:
[] [2] [3] [2 3] 2+3+2+3=10
保证结果在10^18以内。
60%
这道题本意是考察数学规律,但是我当时想成了dfs,而且还没写出来,会超时,只拿到3个测试点的分,就挺遗憾。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 40;
int a[N];
LL ans = 0;
int idx = 1;
bool st[N];
void dfs(int u) {
if (u == idx) {
for (int i = 1; i < idx; i++)
if (st[i]) {
ans += a[i];
}
return;
}
st[u] = true;
dfs(u+1);
st[u] = false;
dfs(u+1);
}
int main() {
int n;
while(cin >> n) {
a[idx] = n;
idx++;
}
dfs(1);
cout << ans << endl;
return 0;
}
数学知识
另一种数学知识就不展开说了,就是每个数在集合中出现的次数会等于2的n-1次方,按照此规律进行求解