题目描述
给定一个集合 s(集合元素数量 ≤30),求出此集合所有子集元素之和。
输入格式
集合中的元素(元素 ≤1000)
输出格式
s 所有子集元素之和。
输入输出样例
输入 #1
2 3
输出 #1
10
说明/提示
【样例解释】
子集为:∅,{2},{3},{2,3},和为 2+3+2+3=10。
【数据范围】
对于 100% 的数据,1≤∣s∣≤30,1≤si≤1000,ss 所有子集元素之和≤10^18。
#include <iostream> // 包含标准输入输出流的头文件
#include <vector> // 包含动态数组(向量)的头文件
using namespace std; // 使用标准命名空间,这样我们就不需要在每个标准库类型前加std::
int main() { // 主函数的开始
vector<int> s; // 定义一个整数类型的动态数组s,用来存储集合中的元素
int n, temp; // 定义两个整数变量,n用来存储集合的大小,temp用来临时存储输入的元素
// 循环读取输入直到输入结束
while (cin >> temp) {
s.push_back(temp); // 将读取的元素添加到向量s的末尾
}
long long sum = 0; // 定义一个长整型变量sum,用来存储所有子集元素之和,使用long long以避免溢出
// 遍历集合中的每个元素
for (int i = 0; i < s.size(); ++i) {
// 对于每个元素s[i],计算其在所有子集中的总和贡献
// 1LL << (s.size() - 1) 计算2的(s.size() - 1)次方,即除了空集外所有可能子集的数量
// 然后将这个数乘以当前元素的值s[i],累加到sum中
sum += (1LL << s.size() - 1) * s[i];
}
cout << sum << endl; // 输出所有子集元素之和的结果
return 0; // 程序正常结束,返回0
}