所有可能子集的乘积之和
给定一个包含 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