public static boolean subsetOfSumDP(int[] set, int sum) {
		if (sum < 0)
			return false;
		if (sum == 0)
			return true;
		if (set == null || set.length <= 0)
			return false;

		boolean[] f = new boolean[sum + 1];
		f[0] = true;
		for (int i = 1; i <= sum; i++) {
			f[i] = false;
		}

		for (int i = 1; i <= set.length; i++) {
			for (int j = sum; j >= 1; j--) {
				if (j >= set[i - 1] && f[j - set[i - 1]]) {
					f[j] = true;
				}
			}
		}
		return f[sum];

		// boolean[][] f=new boolean[set.length+1][sum+1];
		// for(int i=0;i<set.length+1;i++){
		// f[i][0]=true;
		// }
		// for(int i=1;i<sum+1;i++){
		// f[0][i]=false;
		// }
		//
		// for(int i=1;i<=set.length;i++){
		// for(int j=1;j<=sum;j++){
		// f[i][j]=f[i-1][j];
		// if(j>=set[i-1] && f[i-1][j-set[i-1]]){
		// f[i][j]=true;
		// }
		// }
		// }
		// return f[set.length][sum];
	}