C# Program for Subset Sum Problem | DP-25
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.
Example:
Input: set[] = {3, 34, 4, 12, 5, 2}, sum = 9 Output: True //There is a subset (4, 5) with sum 9.
Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.
Following is naive recursive implementation that simply follows the recursive structure mentioned above.
C#
// A recursive solution for subset sum problem using System; class GFG { // Returns true if there is a subset of set[] with sum // equal to given sum static 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 public static void Main() { int [] set = { 3, 34, 4, 12, 5, 2 }; int sum = 9; int n = set .Length; if (isSubsetSum( set , n, sum) == true ) Console.WriteLine( "Found a subset with given sum" ); else Console.WriteLine( "No subset with given sum" ); } } // This code is contributed by Sam007 |
Output:
Found a subset with given sum
We can solve the problem in Pseudo-polynomial time using Dynamic programming.
C#
// A Dynamic Programming solution for subset sum problem using System; class GFG { // Returns true if there is a subset // of set[] with sun equal to given sum static 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 = new bool [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 bottom 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]; } } return subset[sum, n]; } // Driver program public static void Main() { int [] set = { 3, 34, 4, 12, 5, 2 }; int sum = 9; int n = set .Length; if (isSubsetSum( set , n, sum) == true ) Console.WriteLine( "Found a subset with given sum" ); else Console.WriteLine( "No subset with given sum" ); } } // This code is contributed by Sam007 |
Output:
Found a subset with given sum
Please refer complete article on Subset Sum Problem | DP-25 for more details!
Please Login to comment...