建议一种算法,用于查找集合中所有子集的总和。
例如,如果k=3
且子集为{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}
那么子集的总和是{1}+{2}+{3}+{1+2}+{1+3}+{2+3}+{1+2+3}=24
答案 0 :(得分:1)
对于输入{x 1 ,...,x n },返回2 n-1 (x 1 + ... + x n ),因为每个术语都出现在那么多的总和中。
答案 1 :(得分:1)
每个元素出现的次数相同,恰好是2 n-1 ,其中n是元素的数量。所以答案是:计算集合中元素的总和并乘以2 n-1
答案 2 :(得分:0)
答案:
总数没有。子集是2 ^ n。
因为我们不需要空集,所以总需要的子集是2 ^ n - 1。
现在我们所要做的就是获取所有可能的子集。
这个算法会有所帮助。
void main()
{
//Total no. of elements in set = n;
//Let's say the Set be denoted as P[n]
//declare a global variable sum and initialize to 0.
for(int i=1;i<=n;i++)
{
int r = nCi;
//here, r = nCi or you can say n combinations i
//it's good to write an extra function named something like "nCi" to evaluate nCi and call it when required.
//define a new two dimensional array of size "r","i", say s[r][i]
for(int k=0;k<r;k++)
{
//define a function to get all combination array for s[r][i] using "i" elements out of total "n"
//This link will help you with best of code for this particular function
//<http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/>
//now for every particular s[r][i], do this
for(int j=0;j<i;j++)
{
sum = sum + s[r][j];
}
}
}
//display total output
printf("%d",sum);
}