Python Program for Subset Sum Problem | DP-25 - GeeksforGeeks

07 Jul, 2020
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.

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 sumdef 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 functionset = [3, 34, 4, 12, 5, 2]sum = 9n = 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.
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 sumdef 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 functionif __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. 
Found a subset with given sum

Please refer complete article on Subset Sum Problem | DP-25 for more details!
nidhi_biet
Python Programs
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python | Convert a list to dictionary
Python | Convert string dictionary to dictionary
Python program to check whether a number is Prime or not
Python Program for Fibonacci numbers
Iterate over characters of a string in Python
Python Program for factorial of a number
Python | Convert set into a list
Python | Convert a list into a tuple
Python | Check if a variable is string
Python program to add two numbers