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

更新于: 2020年8月14日

582 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告