import java.util.Arrays; class SubsetSum { public static boolean canMakeSum(int[] setOfNums, int targetSum, int index) { if (setOfNums.length == index) { // base case: // the sum either is or is not the target return targetSum == 0; } else { // recursive case: // we must choose to include or exclude the current // number from the running total boolean include = canMakeSum(setOfNums, targetSum - setOfNums[index], index + 1); boolean exclude = canMakeSum(setOfNums, targetSum, index + 1); return include || exclude; } } public static void main(String[] args) { int[] nums = { 3, 7, 1, 8, -3 }; int targetSum = 4; boolean found = canMakeSum(nums, targetSum, 0); System.out.println("For array " + Arrays.toString(nums) + " and target sum = " + targetSum + " found = " + found); targetSum = 0; found = canMakeSum(nums, targetSum, 0); System.out.println("For array " + Arrays.toString(nums) + " and target sum = " + targetSum + " found = " + found); targetSum = 20; found = canMakeSum(nums, targetSum, 0); System.out.println("For array " + Arrays.toString(nums) + " and target sum = " + targetSum + " found = " + found); nums = new int[0]; targetSum = 0; found = canMakeSum(nums, targetSum, 0); System.out.println("For array " + Arrays.toString(nums) + " and target sum = " + targetSum + " found = " + found); targetSum = 1; found = canMakeSum(nums, targetSum, 0); System.out.println("For array " + Arrays.toString(nums) + " and target sum = " + targetSum + " found = " + found); } }