0% found this document useful (0 votes)
550 views

Dynamic Programming - Subset Sum Problem

The document discusses the subset sum problem and two approaches to solve it - a recursive solution and a dynamic programming solution. The subset sum problem is to determine if there exists a subset of a given set of numbers that sums to a given number. The recursive solution recursively checks all possible subsets but has exponential time complexity. The dynamic programming solution builds a 2D table in bottom-up manner to store solutions, checking if the sum can be achieved using numbers from index 0 to j-1, running in pseudo-polynomial time O(sum*n).

Uploaded by

Uttam Singh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
550 views

Dynamic Programming - Subset Sum Problem

The document discusses the subset sum problem and two approaches to solve it - a recursive solution and a dynamic programming solution. The subset sum problem is to determine if there exists a subset of a given set of numbers that sums to a given number. The recursive solution recursively checks all possible subsets but has exponential time complexity. The dynamic programming solution builds a 2D table in bottom-up manner to store solutions, checking if the sum can be achieved using numbers from index 0 to j-1, running in pseudo-polynomial time O(sum*n).

Uploaded by

Uttam Singh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 4

GeeksforGeeks

A computer science portal for geeks

GATE CS

Practice

Suggest

IDE

Q&A

GeeksQuiz

Dynamic Programming | Set 25 (Subset Sum


Problem)
Given a set of non-negative integers, and a value sum, determine if there is a subset of the given set with sum
equal to given sum.
Examples: set[] = {3, 34, 4, 12, 5, 2}, sum = 9
Output: True //There is a subset (4, 5) with sum 9.

Let isSubSetSum(int set[], int n, int sum) be the function to nd whether there is a subset of set[] with sum equal
to sum. n is the number of elements in set[].
The isSubsetSum problem can be divided into two subproblems
a) Include the last element, recur for n = n-1, sum = sum set[n-1]
b) Exclude the last element, recur for n = n-1.
If any of the above the above subproblems return true, then return true.
Following is the recursive formula for isSubsetSum() problem.
isSubsetSum(set, n, sum) = isSubsetSum(set, n-1, sum) ||
isSubsetSum(arr, n-1, sum-set[n-1])
Base Cases:
isSubsetSum(set, n, sum) = false, if sum > 0 and n == 0
isSubsetSum(set, n, sum) = true, if sum == 0

Following is naive recursive implementation that simply follows the recursive structure mentioned above.
// A recursive solution for subset sum problem
#include <stdio.h>
// Returns true if there is a subset of set[] with sun equal to given sum
bool isSubsetSum(int set[], int n, int sum)
{
// Base Cases
if (sum == 0)
return true;

if (n == 0 && sum != 0)
return false;
// If last element is greater than sum, then ignore it
if (set[n-1] > sum)
return isSubsetSum(set, n-1, sum);
/* else, check if sum can be obtained by any of the following
(a) including the last element
(b) excluding the last element */
return isSubsetSum(set, n-1, sum) || isSubsetSum(set, n-1, sum-set[n-1]);
}
// Driver program to test above function
int main()
{
int set[] = {3, 34, 4, 12, 5, 2};
int sum = 9;
int n = sizeof(set)/sizeof(set[0]);
if (isSubsetSum(set, n, sum) == true)
printf("Found a subset with given sum");
else
printf("No subset with given sum");
return 0;
}

Output:
Found a subset with given sum

The above solution may try all subsets of given set in worst case. Therefore time complexity of the above
solution is exponential. The problem is in-fact NP-Complete (There is no known polynomial time solution for
this problem).
We can solve the problem in Pseudo-polynomial time using Dynamic programming. We create a boolean 2D
table subset[][] and ll it in bottom up manner. The value of subset[i][j] will be true if there is a subset of set[0..j1] with sum equal to i., otherwise false. Finally, we return subset[sum][n]
// A Dynamic Programming solution for subset sum problem
#include <stdio.h>
// Returns true if there is a subset of set[] with sun equal to given sum
bool isSubsetSum(int set[], int n, int sum)
{
// The value of subset[i][j] will be true if there is a subset of set[0..j-1]
// with sum equal to i
bool subset[sum+1][n+1];
// If sum is 0, then answer is true

for (int i = 0; i <= n; i++)


subset[0][i] = true;
// If sum is not 0 and set is empty, then answer is false
for (int i = 1; i <= sum; i++)
subset[i][0] = false;
// Fill the subset table in botton up manner
for (int i = 1; i <= sum; i++)
{
for (int j = 1; j <= n; j++)
{
subset[i][j] = subset[i][j-1];
if (i >= set[j-1])
subset[i][j] = subset[i][j] || subset[i - set[j-1]][j-1];
}
}
/* // uncomment this code to print table
for (int i = 0; i <= sum; i++)
{
for (int j = 0; j <= n; j++)
printf ("%4d", subset[i][j]);
printf("\n");
} */
return subset[sum][n];
}
// Driver program to test above function
int main()
{
int set[] = {3, 34, 4, 12, 5, 2};
int sum = 9;
int n = sizeof(set)/sizeof(set[0]);
if (isSubsetSum(set, n, sum) == true)
printf("Found a subset with given sum");
else
printf("No subset with given sum");
return 0;
}

Output:
Found a subset with given sum

Time complexity of the above solution is O(sum*n).


Please write comments if you nd anything incorrect, or you want to share more information about the topic
discussed above.

130 Comments Category: Dynamic Programming Tags: Dynamic Programming

Related Posts:
Count number of ways to ll a n x 4 grid using 1 x 4 tiles
Weighted Job Scheduling in O(n Log n) time
Count number of subsets having a particular XOR value
Permutation Coefcient
Longest Zig-Zag Subsequence
Compute nCr % p | Set 1 (Introduction and Dynamic Programming Solution)
Partition a set into two subsets such that the difference of subset sums is minimum
Count number of paths with at-most k turns

(Login to Rate and Mark)

3.6

Average Difculty : 3.6/5.0


Based on 11 vote(s)

Add to TODO List


Mark as DONE

Writing code in comment? Please use code.geeksforgeeks.org, generate link and share the link here.
@geeksforgeeks, Some rights reserved Contact Us! About Us! Advertise with us!

You might also like