C++ 中所有可能的子集乘积之和
在这个问题中,我们给定一个包含 N 个数字的数组 arr[]。我们的任务是创建一个程序,找到所有可能的子集乘积之和。
在这里,我们将找到所有子集,然后找到每个子集的所有元素的乘积。然后将所有值加起来计算总和。
让我们举个例子来理解这个问题,
输入
arr[] = {4, 5, 6}
输出
209
解释 -
All subsets of arr[] are: {4}, {5}, {6}, {4, 5}, {5, 6}, {4, 6}, {4, 5, 6} Sum of product = (4) + (5) + (6) + (4*5) + (5*6) + (4*6) + (4*5*6) = (4) + (5) + (6) + (20) + (30) + (24) + (120) = 209
解决这个问题的一个简单方法是找到集合的所有子集,并计算每个子集的元素乘积。然后将所有乘积加起来,遍历完所有子集后返回最终的总和。
示例
程序说明我们解决方案的工作原理,
#include<iostream> #include<math.h> using namespace std; int findSumProductSubset(int *arr, int set_length) { unsigned int size = pow(2, set_length); int sum = 0; int product; for(int counter = 1; counter < size; counter++) { product = 1; for(int j = 0; j < size; j++) { if(counter & (1<<j)) product *= arr[j]; } sum += product; } return sum; } int main() { int arr[] = {4, 5, 6}; int n = sizeof(arr)/sizeof(arr[0]); cout<<"The sum of the product of all subsets is "<<findSumProductSubset(arr, n); }
输出
The sum of the product of all subsets is 209
上述方法生成了所有子集,因此具有指数时间复杂度。因此,它不是最有效的方法。
更有效的方法是找到解决方案的模式。
现在,让我们看看一组三个数字 x、y、z。
sum = x + y + z + xy + yz + xz + xyz
sum = x + xz + y + yz + xy + xyz + z + 1 - 1
sum = x(1+z) + y(1+z) + xy(1+z) + 1(z+1) - 1
sum = ( x + y + xy + 1 )( 1 + z ) - 1
sum = ( x(1 + y) + 1(1+y) )(1+z) - 1
sum = (1 + x) * (1 + y) * (1 + z) - 1
这可以用以下方式概括,
对于 n 个元素的集合,
sum = (1+ e1) * (1 + e2) * … * (1 + en) - 1
示例
程序说明我们解决方案的工作原理,
#include <iostream> using namespace std; int productOfSubsetSums(int arr[], int n) { int sum = 1; for (int i = 0; i < n; ++i ) sum *= (arr[i] + 1); sum --; return sum; } int main() { int arr[] = {5, 6, 8 , 9}; int n = sizeof(arr)/sizeof arr[0]; cout<<"Sum of product of all possible subsets is "<<productOfSubsetSums(arr, n); return 0; }
输出
Sum of product of all possible subsets is 3779
广告