vamsu
8/19/2018 - 9:42 PM

Sum exists within a set

Sum exists within a set

import java.io.*;
import java.util.*;

class Solution {
  public static void main(String[] args) {
    Solution solution = new Solution();
    int[][]input = {
      {8,4,1,9,15,17,0,90},
      {2,5,7,4},
      {3,4,5,1,2}
    };
    int[] sum = {
      104,6,16
    };
    for(int i=0;i<input.length;i++) {
      System.out.println("Input: " + Arrays.toString(input[i]) + ", Result: " + solution.setExistsWithSum(input[i], sum[i]) + ", DP: " + solution.setExistsWithSumDP(input[i], sum[i]));
   }
  }
  
  public boolean setExistsWithSum(int[] input, int sum){
    if(input == null || input.length < 1) {
      return false; 
    }
    return setExistsWithSum(input, sum, 0);
  }
  
  public boolean setExistsWithSum(int[] input, int sum, int index) {
    if(sum == 0){
      return true;
    }
    if(index >= input.length) {
      return false; 
    }
    //exclude
    boolean exclude = setExistsWithSum(input, sum, index+1);
    if(exclude) return true;
    
    //include
    boolean include = setExistsWithSum(input, sum-input[index], index+1);
    
    return include;
  }
  
  public boolean setExistsWithSumDP(int[] input, int sum) {
    if(input == null || input.length < 1) {
      return false;
    }
    int n = input.length;
    boolean[][] tracker = new boolean[n+1][sum+1];
    //Sum with zero exists
    for(int i=0;i<=n;i++){
      tracker[i][0] = true;
    }
    
    for(int i=1; i<=n; i++){
      for(int j=1; j<=sum; j++) {
        if(j-input[i-1] < 0) {
          tracker[i][j] = tracker[i-1][j];
        } else {
          tracker[i][j] = tracker[i-1][j] || tracker[i-1][j-input[i-1]]; 
        }
      }
    }
    return tracker[n][sum];
  }
  

}