一定大小的所有子集的总和(=K)
- 最后更新 : 2021年8月17日
给定一个由N个整数和一个正整数K组成的数组 arr[],任务是找出所有大小为K的子集之和。
例子。
**输入:**arr[] = {1, 2, 4, 5}, K = 2
**输出。**36
解释:
大小为K(=2)的子集为={1, 2}, {1, 4}, {1, 5}, {2, 4}, {2, 5}, {4, 5}。现在,所有子集的总和=3+5+6+6+7+9=36。**输入:**arr[] = {2,4,5,6,8},K=3
**输出。**150
天真的方法。解决给定问题的最简单方法是生成给定数组的所有可能的子集,并找出那些大小为K的子集的元素之和。
**时间复杂度。**O(K*2N)
辅助空间。O(1)
高效的方法。通过观察每个元素**arr[i]**在求和序列中出现的次数取决于N和K的值,上述方法也可以被优化。
让我们找出一个一般元素x在求和系列中的出现次数。
- x在所有大小=k的子集的求和数列中的出现率=n-1Ck-1
因此,arr[]的每个元素在求和公式中的频率是相同的=n-1Ck-1。因此,所有子集的总和=(数组中所有元素的总和)*n-1Ck-1。
按照下面的步骤来解决给定的问题。
- 初始化变量,如freq为0,计算n-1Ck-1
- 初始化变量,如sum为0,以存储所有数组元素的总和。
- 执行上述步骤后,打印sum*freq的值作为结果和。
下面是上述方法的实现。
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function to find the sum of all// sub-sets of size Kvoid findSumOfAllSubsets(int arr[],int n,int k){// Frequency of each array element// in summation equation.int factorial_N=1, factorial_d=1, factorial_D=1;//calculate factorial of n-1for(int i=1; i<=n-1; i++)factorial_N*=i;//calculate factorial of k-1for(int i=1; i<=k-1; i++)factorial_d*=i;//calculate factorial of n-kfor(int i=1; i<=n-k; i++)factorial_D*=i;int freq = factorial_N/(factorial_d * factorial_D);// Calculate sum of array.int sum = 0;for (int i = 0; i < n; i++)sum += arr[i];// Sum of all subsets of size k.sum = sum * freq;cout <<"Sum of all subsets of size = "<<k<<" is => "<< sum << endl;}// Driver Codeint main(){int arr[] = { 1, 2, 4, 5 };int n = 4, k = 2;findSumOfAllSubsets(arr, n, k);return 0;} |
输出
36
**时间复杂度。**O(N)
辅助空间。O(1)
读者请注意!现在不要停止学习。以学生可接受的价格获得所有重要的DSA概念。 DSA自学课程以适合学生的价格掌握所有重要的DSA概念,并为行业做好准备。 要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.
如果你想参加专家的现场课程 ,请参考 针对在职专业人士的DSA现场课程 和 面向学生的竞争性编程直播.
我的个人笔记 arrow_drop_up
保存