笔记——特定大小的所有子集的总和

162 阅读2分钟

一定大小的所有子集的总和(=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
  • 初始化变量,如sum0,以存储所有数组元素的总和
  • 执行上述步骤后,打印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 K
void 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-1
for(int i=1; i<=n-1; i++)
factorial_N*=i;
//calculate factorial of k-1
for(int i=1; i<=k-1; i++)
factorial_d*=i;
//calculate factorial of n-k
for(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 Code
int 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

保存