在 C++ 中查找数组的所有不同子集(或子序列)和
假设我们有一组整数。找到给定集合的子集可以形成的不同和,并按升序打印出来。数组元素的和很小。考虑 [1, 2, 3] 之类的数组元素。输出将是 0、1、2、3、4、5、6。不同的子集为 {}、{1}、{2}、{3}、{1, 2}、{2, 3}、{1, 3}、{1, 2, 3},和值分别为 0、1、2、3、3、5、4、6。
要解决这个问题,我们将使用动态规划方法。当给定元素的和很小时,我们可以创建一个 DP 表,其中行包含数组的大小,而列的大小将是给定数组中所有元素的和。
示例
#include<iostream>
#include<cstring>
using namespace std;
void displaySubsetSum(int arr[], int n) {
int sum = 0;
for (int i=0; i<n; i++)
sum += arr[i];
bool table[n+1][sum+1];
memset(table, 0, sizeof(table));
for (int i=0; i<=n; i++)
table[i][0] = true;
for (int i=1; i<=n; i++) {
table[i][arr[i-1]] = true;
for (int j=1; j<=sum; j++) {
if (table[i-1][j] == true) {
table[i][j] = true;
table[i][j + arr[i-1]] = true;
}
}
}
for (int j=0; j<=sum; j++)
if (table[n][j]==true)
cout << j << " ";
}
int main() {
int arr[] = {1, 2, 3};
int n = sizeof(arr)/sizeof(arr[0]);
displaySubsetSum(arr, n);
}输出
0 1 2 3 4 5 6
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP