lincode. 730 所有子集的和

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

点击打开链接

题目描述:

给一整数 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:注意一下整数范围,数据大了会有溢出

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





猜你喜欢

转载自blog.csdn.net/qq_37925512/article/details/79102995
730
今日推荐