原文:

给定一个整数数组,打印其中所有子集的和。输出总和可以以任何顺序打印。

示例:

input : arr[] = {2, 3}
output: 0 2 3 5
input : arr[] = {2, 4, 5}
output : 0 2 4 5 6 7 9 11

方法 1(递归) 我们可以递归解决这个问题。总共有 2 个 n 个子集。对于每个元素,我们考虑两个选择,我们将它包含在一个子集中,而不将其包含在一个子集中。以下是基于这一思想的递归pg电子试玩链接的解决方案。

c

// c   program to print sums of all possible
// subsets.
#include 
using namespace std;
// prints sums of all subsets of arr[l..r]
void subsetsums(int arr[], int l, int r, int sum = 0)
{
    // print current subset
    if (l > r) {
        cout << sum << " ";
        return;
    }
    // subset including arr[l]
    subsetsums(arr, l   1, r, sum   arr[l]);
    // subset excluding arr[l]
    subsetsums(arr, l   1, r, sum);
}
// driver code
int main()
{
    int arr[] = { 5, 4, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);
    subsetsums(arr, 0, n - 1);
    return 0;
}

java 语言(一种计算机语言,尤用于创建网站)

// java program to print sums
// of all possible subsets.
import java.io.*;
class gfg {
    // prints sums of all
    // subsets of arr[l..r]
    static void subsetsums(int[] arr, int l, int r, int sum)
    {
        // print current subset
        if (l > r) {
            system.out.print(sum   " ");
            return;
        }
        // subset including arr[l]
        subsetsums(arr, l   1, r, sum   arr[l]);
        // subset excluding arr[l]
        subsetsums(arr, l   1, r, sum);
    }
    // driver code
    public static void main(string[] args)
    {
        int[] arr = { 5, 4, 3 };
        int n = arr.length;
        subsetsums(arr, 0, n - 1, 0);
    }
}
// this code is contributed by anuj_67

python 3

# python3 program to print sums of
# all possible subsets.
# prints sums of all subsets of arr[l..r]
def subsetsums(arr, l, r, sum=0):
    # print current subset
    if l > r:
        print(sum, end=" ")
        return
    # subset including arr[l]
    subsetsums(arr, l   1, r, sum   arr[l])
    # subset excluding arr[l]
    subsetsums(arr, l   1, r, sum)
# driver code
arr = [5, 4, 3]
n = len(arr)
subsetsums(arr, 0, n - 1)
# this code is contributed by shreyanshi arun.

c

// c# program to print sums of all possible
// subsets.
using system;
class gfg {
    // prints sums of all subsets of
    // arr[l..r]
    static void subsetsums(int[] arr, int l, int r, int sum)
    {
        // print current subset
        if (l > r) {
            console.write(sum   " ");
            return;
        }
        // subset including arr[l]
        subsetsums(arr, l   1, r, sum   arr[l]);
        // subset excluding arr[l]
        subsetsums(arr, l   1, r, sum);
    }
    // driver code
    public static void main()
    {
        int[] arr = { 5, 4, 3 };
        int n = arr.length;
        subsetsums(arr, 0, n - 1, 0);
    }
}
// this code is contributed by anuj_67

服务器端编程语言(professional hypertext preprocessor 的缩写)

 $r)
    {
        echo $sum , " ";
        return;
    }
    // subset including arr[l]
    subsetsums($arr, $l   1, $r,
               $sum   $arr[$l]);
    // subset excluding arr[l]
    subsetsums($arr, $l   1, $r, $sum);
}
// driver code
$arr = array(5, 4, 3);
$n = count($arr);
subsetsums($arr, 0, $n - 1);
// this code is contributed by anuj_67.
?>

java 描述语言


输出:

12 9 8 5 7 4 3 0

这个解的时间复杂度是 o(2^n),空间复杂度是 o(2^n).

方法 2(迭代) 如上所述,总共有 2 个 n 个子集。想法是生成从 0 到 2n–1 的循环。对于每个数字,选择当前数字的二进制表示中对应于 1 的所有数组元素。

c

// iterative c   program to print sums of all
// possible subsets.
#include 
using namespace std;
// prints sums of all subsets of array
void subsetsums(int arr[], int n)
{
    // there are totoal 2^n subsets
    long long total = 1 << n;
    // consider all numbers from 0 to 2^n - 1
    for (long long i = 0; i < total; i  ) {
        long long sum = 0;
        // consider binary representation of
        // current i to decide which elements
        // to pick.
        for (int j = 0; j < n; j  )
            if (i & (1 << j))
                sum  = arr[j];
        // print sum of picked elements.
        cout << sum << " ";
    }
}
// driver code
int main()
{
    int arr[] = { 5, 4, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);
    subsetsums(arr, n);
    return 0;
}

java 语言(一种计算机语言,尤用于创建网站)

// iterative java program to print sums of all
// possible subsets.
import java.util.*;
class gfg {
    // prints sums of all subsets of array
    static void subsetsums(int arr[], int n)
    {
        // there are totoal 2^n subsets
        int total = 1 << n;
        // consider all numbers from 0 to 2^n - 1
        for (int i = 0; i < total; i  ) {
            int sum = 0;
            // consider binary representation of
            // current i to decide which elements
            // to pick.
            for (int j = 0; j < n; j  )
                if ((i & (1 << j)) != 0)
                    sum  = arr[j];
            // print sum of picked elements.
            system.out.print(sum   " ");
        }
    }
    // driver code
    public static void main(string args[])
    {
        int arr[] = new int[] { 5, 4, 3 };
        int n = arr.length;
        subsetsums(arr, n);
    }
}
// this code is contributed by spp____

python 3

# iterative python3 program to print sums of all possible subsets
# prints sums of all subsets of array
def subsetsums(arr, n):
    # there are totoal 2^n subsets
    total = 1 << n
    # consider all numbers from 0 to 2^n - 1
    for i in range(total):
       sum = 0
       # consider binary representation of
       # current i to decide which elements
       # to pick.
       for j in range(n):
          if ((i & (1 << j)) != 0):
              sum  = arr[j]
       # print sum of picked elements.
       print(sum, "", end = "")
arr = [ 5, 4, 3 ]
n = len(arr)
subsetsums(arr, n);
# this code is contributed by mukesh07.

c

// iterative c# program to print sums of all
// possible subsets.
using system;
class gfg {
    // prints sums of all subsets of array
    static void subsetsums(int[] arr, int n)
    {
        // there are totoal 2^n subsets
        int total = 1 << n;
        // consider all numbers from 0 to 2^n - 1
        for (int i = 0; i < total; i  ) {
            int sum = 0;
            // consider binary representation of
            // current i to decide which elements
            // to pick.
            for (int j = 0; j < n; j  )
                if ((i & (1 << j)) != 0)
                    sum  = arr[j];
            // print sum of picked elements.
            console.write(sum   " ");
        }
    }
  static void main() {
    int[] arr = { 5, 4, 3 };
    int n = arr.length;
    subsetsums(arr, n);
  }
}
// this code is contributed by divyesh072019.

服务器端编程语言(professional hypertext preprocessor 的缩写)


java 描述语言


输出:

0 5 4 9 3 8 7 12 

时间复杂度: o( ) 辅助空间: o(1) 感谢 cfh 在评论中提出上述迭代解。 注意:我们实际上并没有创建子集来寻找它们的和,而是使用递归来寻找给定集合的非连续子集的和。

上述技术可用于对子集执行各种操作,如乘法、除法、异或等,而无需实际创建和存储子集,从而使程序存储器高效。 本文由 供稿。如果你喜欢 geeksforgeeks 并想投稿,你也可以使用写一篇文章或者把你的文章邮寄到 review-team@geeksforgeeks.org。看到你的文章出现在极客博客pg电子试玩链接主页上,帮助其他极客。 如果发现有不正确的地方,或者你想分享更多关于上面讨论的话题的信息,请写评论。不正确,或者你想分享更多关于上面讨论的话题的信息