1
+ package DynamicProgramming ;
2
+
3
+ public class SubsetSum {
4
+
5
+ /*
6
+ This algorithm will determine if a set of integers contains
7
+ a subset that sum to a given integer. The algorithm will
8
+ return true if such a subset exists and false otherwise.
9
+ This is a dynamic programming implementation.
10
+ */
11
+
12
+ private static boolean subsetSum (int arr [], int n , int sum ){
13
+ boolean isSum [][] = new boolean [n + 2 ][sum + 1 ];
14
+
15
+ isSum [n + 1 ][0 ] = true ;
16
+ for (int i = 1 ; i <= sum ; i ++) {
17
+ isSum [n + 1 ][i ] = false ;
18
+ }
19
+
20
+ for (int i = n ; i > 0 ; i --) {
21
+ isSum [i ][0 ] = true ;
22
+ for (int j = 1 ; j <= arr [i - 1 ] - 1 ; j ++) {
23
+ if (j <= sum ) {
24
+ isSum [i ][j ] = isSum [i + 1 ][j ];
25
+ }
26
+ }
27
+ for (int j = arr [i - 1 ]; j <= sum ; j ++) {
28
+ isSum [i ][j ] = (isSum [i + 1 ][j ] || isSum [i + 1 ][j - arr [i - 1 ]]);
29
+ }
30
+ }
31
+
32
+ return isSum [1 ][sum ];
33
+ }
34
+
35
+ /*
36
+ This is a driver method to run the algorithm with four
37
+ test values: the first two should evaluate true, and the
38
+ last two should evaluate false.
39
+ */
40
+ public static void main (String args []) {
41
+ int arr [] = new int []{50 , 4 , 10 , 15 , 34 };
42
+ int n = arr .length ;
43
+ // 4 + 10 + 15 + 34 = 64
44
+ int sum1 = 64 ;
45
+ // 50 + 15 + 34 = 99
46
+ int sum2 = 99 ;
47
+ // No subset of the given array will give a sum
48
+ // of 5 or 66
49
+ int sum3 = 5 ;
50
+ int sum4 = 66 ;
51
+
52
+ System .out .println (subsetSum (arr , n , sum1 ));
53
+ System .out .println (subsetSum (arr , n , sum2 ));
54
+ System .out .println (subsetSum (arr , n , sum3 ));
55
+ System .out .println (subsetSum (arr , n , sum4 ));
56
+ }
57
+ }
0 commit comments