日期:2021-04-24
作者:19届WY
标签:数学问题,控制输入结束,组合数求和&公式
题目描述
解题:
以第n个元素an为例,
- 当子集只有一个元素时,选中an,剩余n-1个元素不选,an出现C0n-1次
- 当子集有两个元素时,先选中an,再从剩下的n-1个元素中选一个,是C1n-1种选法,所以an出现C1n-1次
- 当子集中有三个元素时,先选中an,再从剩下的n-1个元素中选两个,C2n-1种选法,所以an出现C2n-1次
- 依此类推, 当子集有n-1个元素时,先选中an,再从剩下的n-1个元素中选n-2个,是Cn-2n-1种选法,所以an出现Cn-2n-1次
- 最后有n个元素时,只有一种情况,除了an,剩下n-1个元素都选,也就是an出现Cn-1n-1次
- 这样累加an出现的次数,由组合数求和公式可知,C0n-1+C1n-1+C2n-1+……+Cn-1n-1 = 2n-1
- 所以每个元素出现的次数都是2n-1
- 把所有元素相加乘上2n-1即是所有子集的和
- 本题犯的小错误:①考虑sum的范围②考虑输入的结束,用
cin.peek()!='\n\'
会超时
#include<iostream>
#include <math.h>
using namespace std;
int main(){
int a,i=0;
long long sum=0;
while(cin>>a){ //输入 control+z结束
sum += a;
i++;
}
int x = pow(2,i-1);
sum *= x;
cout<<sum;
}