using
System;
using
System.Collections.Generic;
public
class
SubSet_sum_problem
{
static
bool
[, ] dp;
static
void
display(List<
int
> v)
{
foreach
(
var
i
in
v) Console.Write(i +
" "
);
Console.WriteLine();
}
static
void
printSubsetsRec(
int
[] arr,
int
i,
int
sum,
List<
int
> p)
{
if
(i == 0 && sum != 0 && dp[0, sum]) {
p.Add(arr[i]);
display(p);
p.Clear();
return
;
}
if
(i == 0 && sum == 0) {
display(p);
p.Clear();
return
;
}
if
(dp[i - 1, sum]) {
List<
int
> b =
new
List<
int
>();
b.AddRange(p);
printSubsetsRec(arr, i - 1, sum, b);
}
if
(sum >= arr[i] && dp[i - 1, sum - arr[i]]) {
p.Add(arr[i]);
printSubsetsRec(arr, i - 1, sum - arr[i], p);
}
}
static
void
printAllSubsets(
int
[] arr,
int
n,
int
sum)
{
if
(n == 0 || sum < 0)
return
;
dp =
new
bool
[n, sum + 1];
for
(
int
i = 0; i < n; ++i) {
dp[i, 0] =
true
;
}
if
(arr[0] <= sum)
dp[0, arr[0]] =
true
;
for
(
int
i = 1; i < n; ++i)
for
(
int
j = 0; j < sum + 1; ++j)
dp[i, j] = (arr[i] <= j)
? (dp[i - 1, j]
|| dp[i - 1, j - arr[i]])
: dp[i - 1, j];
if
(dp[n - 1, sum] ==
false
) {
Console.WriteLine(
"There are no subsets with"
+
" sum "
+ sum);
return
;
}
List<
int
> p =
new
List<
int
>();
printSubsetsRec(arr, n - 1, sum, p);
}
public
static
void
Main(
string
[] args)
{
int
[] arr = { 1, 2, 3, 4, 5 };
int
n = arr.Length;
int
sum = 10;
printAllSubsets(arr, n, sum);
}
}