集合的所有子集的值的和
【问题】:
给一个集合,包含n个数。
规定集合的值为集合中所有元素的和。
求,该集合的所有子集的值的和。
【数据】:
[1, 2]
子集是:[空集], [1], [2], [1, 2]
答案是: 1 + 2 + (1 + 2) = 6;
【分析】:
这一题不能正向思考,去枚举所有的子集然后计算和。
因为子集的数量是2^n, 所以效率极低。
数学的方法就是来计算贡献。
我们计算每个元素在结果中贡献了多少,在本题中就是在多少个子集合中出现了就加多少次。
每个元素会在多少子集合中出现?
我们来考虑去掉这个元素以后,原集合有多少个子集合, 在这些所有的子集合中都加上这个元素就是这个元素出现的次数了。
有n-1个元素的集合共有2^(n-1)个子集, 所以每个元素都出现了2^(n-1)次。
所以就是(ans = a[0]*(2^(n-1)) + .....+ a[n]*(2^(n-1)))
也就是 ans = sum*2^(n-1).