Dynamic Programming - Subset Sum Problem
Dynamic Programming - Subset Sum Problem
GATE CS
Practice
Suggest
IDE
Q&A
GeeksQuiz
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
Output:
Found a subset with given sum
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
3.6
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!