📜  所有可能子集的乘积之和

📅  最后修改于: 2022-05-13 01:57:47.909000             🧑  作者: Mango

所有可能子集的乘积之和

给定一个包含 n 个非负整数的数组。任务是找到所有可能子集的元素的乘积之和。可以假设子集中的数字很小并且计算产品不会导致算术溢出。
例子 :

Input : arr[] = {1, 2, 3}
Output : 23
Possible Subset are: 1, 2, 3, {1, 2}, {1, 3}, 
                     {2, 3}, {1, 2, 3}
Products of elements in above subsets :
1, 2, 3, 2, 3, 6, 6
Sum of all products = 1 + 2 + 3 + 2 + 3 + 6 + 6 
                    = 23

朴素的方法:简单的方法是一一生成所有可能的子集并计算所有元素的总和。这种方法的时间复杂度是指数级的,因为总共有 2 n – 1 个子集。
一种有效的方法是将整个问题概括为某种模式。假设我们有两个数字 a 和 b。我们可以将所有可能的子集产品写成:-

= a + b + ab 
   = a(1+b) + b + 1 - 1 
   = a(1+b) + (1+b) - 1 
   = (a + 1) * (b + 1) - 1
   = (1+a) * (1 + b) - 1

现在取三个数字 a, b, c:-

= a + b + c + ab + bc + ca + abc 
   = a + ac + b + bc + ab + abc + c + 1 - 1
   = a(1+c) + b(1+c) + ab(1+c) + c + 1 - 1
   = (a + b + ab + 1)(1+c) - 1 
   = (1+a) * (1+b) * (1+c) - 1  

上述模式可以推广到 n 个数字。
以下是上述想法的实现:

C++
// C++ program to find sum of product of
// all subsets.
#include 
using namespace std;
 
// Returns sum of products of all subsets
// of arr[0..n-1]
int productOfSubsetSums(int arr[], int n)
{
    int ans = 1;
    for (int i = 0; i < n; ++i )
        ans = ans * (arr[i] + 1);
    return ans-1;
}
 
// Driver code
int main()
{
    int arr[] = {1, 2, 3, 4};
    int n = sizeof(arr)/sizeof arr[0];
    cout << productOfSubsetSums(arr, n);
    return 0;
}


Java
// Java program to find sum of product of
// all subsets.
 
public class Subset
{
    // Returns sum of products of all subsets
    // of arr[0..n-1]
    static int productOfSubsetSums(int arr[], int n)
    {
        int ans = 1;
        for (int i = 0; i < n; ++i )
            ans = ans * (arr[i] + 1);
        return ans-1;
    }
     
    public static void main (String[] args)
    {
        int arr[] = {1, 2, 3, 4};
        int n = arr.length;
        System.out.println(productOfSubsetSums(arr, n));
    }
}
 
// This code is contributed by Saket Kumar


Python3
# Python3 program to
# find sum of product of
# all subsets.
 
# Returns sum of products
# of all subsets
# of arr[0..n-1]
def productOfSubsetSums(arr, n):
    ans = 1;
    for i in range(0,n):
        ans = ans * (arr[i] + 1)
    return ans-1
 
# Driver code
arr = [1, 2, 3, 4]
n = len(arr)
 
print (productOfSubsetSums(arr, n))
     
# This code is contributed
# by Shreyanshi Arun.


C#
// C# program to find sum of
// product of all subsets.
using System;
 
public class Subset
{
     
    // Returns sum of products of all
    // subsets of arr[0..n-1]
    static int productOfSubsetSums(int []arr, int n)
    {
        int ans = 1;
        for (int i = 0; i < n; ++i )
            ans = ans * (arr[i] + 1);
        return ans-1;
    }
     
    // Driver Code
    public static void Main ()
    {
        int []arr = {1, 2, 3, 4};
        int n = arr.Length;
        Console.Write(productOfSubsetSums(arr, n));
    }
}
 
// This code is contributed by Nitin Mittal.


PHP


Javascript


输出:

119