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
广告
数据结构
网络
关系型数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP