lincode. 730 所有子集的和

本文介绍了一种计算前n个自然数所有可能子集元素和的方法,并通过递归公式实现。利用递推思想,从简单情况出发逐步推导出一般规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参加了一位博主的思路,加上自己的一些理解

点击打开链接

题目描述:

给一整数 n, 我们需要求前n个自然数形成的集合的所有可能子集中所有元素的和。

样例

给出 n = 2, 返回 6
可能的子集为 {{1}, {2}, {1, 2}}. 
子集的元素和为 1 + 2 + 1 + 2 = 6

给出 n = 3, 返回 24
可能的子集为 {{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
子集的和为:
1 + 2 + 3 + (1 + 2) + (1 + 3) + (2 + 3) + (1 + 2 + 3) = 24

思路:

从最简单的两个元素出发{1,2},子集:{1}, {2}, {1,2},{}  sum = 6

此时:我们如果在加上一个3,也就是找集合{1,2,3}的子集,有趣的地方就来了

新集合的子集:①原来{1,2}的子集;②原来{1,2}的子集,每个集合里加上元素3;③新集合{3}

得到递推公式:sum_of_All_subset(3) = sum_of_All_subset(2) * 2 + 3 * pow(2, 3 - 1);

3 * pow(2, 3 - 1):相当于3出现了2^(3 - 1)次方次:及{1, 2}的自己个数2 ^ (2 - 1) 加上1

同理将{1, 2,  3}看作一个新的整体加上元素4,新集合的子集也可以分为原来的三种情况

因此递归公式即为:sum_of_All_subset(n) = sum_of_all_subset(n - 1) * 2 + n * pow(2, n - 1)


 

代码:

class Solution {
public:
    /*
     * @param : the given number
     * @return: Sum of elements in subsets
     */
    int subSum(int n) {
        // write your code here
        if(0 == n) return 0;
        long long int result = 0;
        result = subSum(n - 1) * 2 + n * static_cast<long long>(pow(2, n-1));
        return result;
    }
    

};

PS:注意一下整数范围,数据大了会有溢出

不得不说,自己数学确实是个战五渣。。。。不过,继续加油。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值