集合中所有子集元素之和

【题目】

给一个集合array,包含n个数。
规定集合的"值"为集合中所有元素的和。
求该集合的所有子集的值的和。

【示例】

数组[1,2]
它的子集有空集[],[1],[2],[1,2]
子集各自的值为0,1,2,3
所以子集值的和为0+1+2+3=6

【解法一】
思路:简单暴力的方法就是穷举数组所有的子集,然后逐个求子集的值,然后相加得到最终的结果。

缺点:时间复杂度高,每个集合的子集个数为2^n个。

实现:
太麻烦了,不实现了。

【解法二】
思路:通过计算每个元素在求和过程中出现的次数,尝试获取一种规律。

[1]==> 0+1=1 // 1出现一次
[1,2]==>0+1+2+(1+2)=6 // 1出现2次,2出现2次
[1,2,3]===>0+1+2+3+(1+2)+(1+3)+(2+3)+(1+2+3)=24 // 1,2,3出现4次

由于集合中元素具有无序性, 所以集合中每个元素在子集中出现的次数是相同的。这样的话,问题就简单了,求所有子集元素的和就可以简化为求每个元素在子集中出现的次数*全集中所有元素的和。全集中所有元素的和好求,就是n*(n+1)/2。

集合中任何一个元素出现的次数,比如1,我们可以这样来求:

首先一个集合的子集个数是2n,这个都学过,我就不推导了。

我们想求 1 出现 的次数,不好求,我们可以转化为求 1 不出现的次数,1 不出现的次数就是原来集合中除了元素 1 的元素的集合的子集个数。不明白??举个例子

{1,2,3,4}这个集合子集的个数是24,除去 1 之后集合就变为 {2,3,4}这个集合的子集个数是23,也就是说只有这些集合中没有 1 ,我们想求的 1 出现的个数就是24-23

所以在含n个元素的集合中,任何一个元素在子集中出现的次数就是2n-2n-1=2n-1

所以集合中所有元素之和sum=(n*(n+1)/2)*(2n-1)

好像有点规律了,每个元素在求和过程中出现的次数是一样的。假设出现的次数是N

sum = (1+2+3+4+...+n) * N

N的值又和数组的长度有关系,N=2^(n-1)

sum = (1+2+3+4+...+n) * 2^(n-1)

【实现】

#include<stdio.h>

#include<math.h>

int main()

{

    int n,sum;

    printf("输入数字 N : "); 

    scanf("%d",&n);

    sum=pow(2,n-1)*(n*(n+1)/2);

    printf("和为%d\n",sum);
}

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值