using
System;
class
GFG{
static
int
findWays(
int
[] nums,
int
S)
{
int
sum = 0;
for
(
int
i = 0; i < nums.Length; i++)
sum += nums[i];
int
[,] memo =
new
int
[nums.Length + 1,
2 * sum + 1];
for
(
int
i = 0; i < memo.GetLength(0); i++)
{
for
(
int
j = 0; j < memo.GetLength(1); j++)
{
memo[i, j] =
int
.MinValue;
}
}
return
dfs(memo, nums, S, 0, 0, sum);
}
static
int
dfs(
int
[,] memo,
int
[] nums,
int
S,
int
curr_sum,
int
index,
int
sum)
{
if
(index == nums.Length)
{
if
(S == curr_sum)
return
1;
else
return
0;
}
if
(memo[index, curr_sum + sum] !=
int
.MinValue)
{
return
memo[index, curr_sum + sum];
}
int
ans = dfs(memo, nums, index + 1,
curr_sum + nums[index], S, sum) +
dfs(memo, nums, index + 1,
curr_sum - nums[index], S, sum);
memo[index, curr_sum + sum] = ans;
return
ans;
}
public
static
void
Main(String[] args)
{
int
S = 3;
int
[] arr =
new
int
[] { 1, 2, 3, 4, 5 };
int
answer = findWays(arr, S);
Console.WriteLine(answer);
}
}