题目描述
给定一个集合 s(集合元素数量 ≤30),求出此集合所有子集元素之和。
输入格式
集合中的元素(元素 ≤1000)
输出格式
s 所有子集元素之和
此题有公式!!!
给定一个数字集合S = {a1,a2,a3,a4...,an},其所有子集元素之和为(a1+a2+...+an)*2^(n-1)
推导过程大家可以自行搜索,在此帮助大家解决如何记忆这个公式.
由所有子集元素之和联想到先把所有最简单的子集相加即a1+a2+...+an---->想成集合S的各个小弟
*读作乘以,那么我们就谐音成诚意
2谐音成儿子
^(n-1)读作n-1次方,谐音成n-1次拜访(次访----次方)
故事开始
各小弟(a1+a2+...+an)诚意(*)要做集合S的儿子(2),于是对S进行了n-1次拜访.为啥不是n次拜访(^)呢?因为第n次的时候各小弟已经是S的儿子了,成为自家人就不用拜访啦!
#include<bits/stdc++.h>
using namespace std; //集合元素<=30,所以a数组整30个元素
int a[30],i=0,s=0,j; //s存各元素之和
long long sum=0; //sum是子集元素之和,因为数据大,开long long
int main(){
while(cin>>a[i++]); //向a数组输入数,i++的意思是先使用i再加一,结束时i为2
for(j=0;j<=i-1;j++) //下标0开始,所以是一直到i-1
s=s+a[j]; //求集合中各元素之和
sum=s*pow(2,i-2); //利用公式求,pow是c++内置函数,作用是一个数的多少次幂
cout<<sum; //输出结果
}