描述
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和。
输入
集合中的元素(元素<=1000)。
输出
一个正整数表示元素之和。
输入样例 1
2 3
输出样例 1
10
提示
样例解释:
子集为:{ }, {2}, {3}, {2, 3};
元素之和为:2+3+2+3 = 10;
思路
这道题是一道找规律题,假设有n个元素
每次固定第一个元素,组合剩下的元素
子集元素个数为1时,每个元素会出现 C n − 1 0 C_{n-1}^0 Cn−10次
子集元素个数为2时,每个元素会出现 C n − 1 1 C_{n-1}^1 Cn−11次
……(以此类推)
子集元素个数为n时,每个元素会出现 C n − 1 n − 1 C_{n-1}^{n-1} Cn−1n−1次
所以每个元素都会出现 C n − 1 0 + C n − 1 1 + … … + C n − 1 n − 1 C_{n-1}^0+C_{n-1}^1+……+C_{n-1}^{n-1} Cn−10+Cn−11+……+Cn−1n−1次
由二项式系数和可知,上式等于 2 n − 1 2^{n-1} 2n−1,这便是本题的思路
代码
#include <iostream>
#include <cmath>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n[1010], i = 0;
long long res = 0;
while(cin >> n[i++]) res += n[i - 1]; // 这块cin.get()只能用来本地调试
cout << (long long)(res*pow(2, i - 2)); // 输出运算需要强制类型转换来规定格式
return 0;
}