Python 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.
Python3
# A recursive solution for subset sum # problem # Returns true if there is a subset # of set[] with sun equal to given sum def isSubsetSum( set , n, sum ) : # Base Cases if ( sum = = 0 ) : return True if (n = = 0 and 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 ) or isSubsetSum( set , n - 1 , sum - set [n - 1 ]) # Driver program to test above function set = [ 3 , 34 , 4 , 12 , 5 , 2 ] sum = 9 n = len ( set ) if (isSubsetSum( set , n, sum ) = = True ) : print ( "Found a subset with given sum" ) else : print ( "No subset with given sum" ) # This code is contributed by Nikita Tiwari. |
Output:
Found a subset with given sum
We can solve the problem in Pseudo-polynomial time using Dynamic programming.
Python3
# A Dynamic Programming solution for subset sum problem # Returns true if there is a subset of # set[] with sun equal to given sum # Returns true if there is a subset of set[] # with sun equal to given sum def isSubsetSum( set , n, 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 subset = ([[ False for i in range ( sum + 1 )] for i in range (n + 1 )]) # If sum is 0, then answer is true for i in range (n + 1 ): subset[i][ 0 ] = True # If sum is not 0 and set is empty, # then answer is false for i in range ( 1 , sum + 1 ): subset[ 0 ][i] = False # Fill the subset table in bottom up manner for i in range ( 1 , n + 1 ): for j in range ( 1 , sum + 1 ): if j< set [i - 1 ]: subset[i][j] = subset[i - 1 ][j] if j> = set [i - 1 ]: subset[i][j] = (subset[i - 1 ][j] or subset[i - 1 ][j - set [i - 1 ]]) # uncomment this code to print table # for i in range(n + 1): # for j in range(sum + 1): # print (subset[i][j], end =" ") # print() return subset[n][ sum ] # Driver program to test above function if __name__ = = '__main__' : set = [ 3 , 34 , 4 , 12 , 5 , 2 ] sum = 9 n = len ( set ) if (isSubsetSum( set , n, sum ) = = True ): print ( "Found a subset with given sum" ) else : print ( "No subset with given sum" ) # This code is contributed by # sahil shelangia. |
Output:
Found a subset with given sum
Please refer complete article on Subset Sum Problem | DP-25 for more details!
Please Login to comment...