class SubsetSum{
public static void main
(String[] args
){ int[] arr=new int[]{ -7, -3, -2, 5, 8};
System.
out.
println(solve
(arr,
0)); }
public static boolean solve(int[] numbers, int target) {
//Safeguard against invalid parameters
if ((target < 0) || (sum(numbers) < target)){
return false;
}
boolean [][] table = new boolean [target + 1] [numbers.length + 1] ;
for (int i = 0; i <= numbers.length; ++i) {
table[0][i] = true;
}
/* Base cases have been covered.
* Now look set subsets [1..n][target] to be true or false.
* n represents the number of elements from the start that have a subset
* that sums to target
*/
for (int i = 1; i <= target; ++i){
for (int j = 1; j <= numbers.length; ++j){
/* Mark index j as one of the numbers in the array
* which is part of the solution with the given subtarget */
table [i][j] = table[i][j-1];
if (i >= numbers[j-1])
table[i][j] = table[i][j] || table[i - numbers[j-1]] [j-1];
}
}
return table[target][numbers.length];
}
private static int sum(int[] numbers) {
int s=0;
for(int i:numbers){
s+=i;
}
return s;
}
}
Y2xhc3MgU3Vic2V0U3VtewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CgkJaW50W10gYXJyPW5ldyBpbnRbXXsgLTcsIC0zLCAtMiwgNSwgOH07CgkJU3lzdGVtLm91dC5wcmludGxuKHNvbHZlKGFyciwwKSk7Cgl9CglwdWJsaWMgc3RhdGljIGJvb2xlYW4gc29sdmUoaW50W10gbnVtYmVycywgaW50IHRhcmdldCkgewoKCSAgICAvL1NhZmVndWFyZCBhZ2FpbnN0IGludmFsaWQgcGFyYW1ldGVycwoJICAgIGlmICgodGFyZ2V0IDwgMCkgfHwgKHN1bShudW1iZXJzKSA8IHRhcmdldCkpewoJICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgfQoKCSAgICBib29sZWFuIFtdW10gdGFibGUgPSBuZXcgYm9vbGVhbiBbdGFyZ2V0ICsgMV0gW251bWJlcnMubGVuZ3RoICsgMV0gIDsKCgkgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbnVtYmVycy5sZW5ndGg7ICsraSkgewoJICAgICAgICB0YWJsZVswXVtpXSA9IHRydWU7CgkgICAgfQoKCSAgICAvKiBCYXNlIGNhc2VzIGhhdmUgYmVlbiBjb3ZlcmVkLiAKCSAgICAgKiBOb3cgbG9vayBzZXQgc3Vic2V0cyBbMS4ubl1bdGFyZ2V0XSB0byBiZSB0cnVlIG9yIGZhbHNlLgoJICAgICAqIG4gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZyb20gdGhlIHN0YXJ0IHRoYXQgaGF2ZSBhIHN1YnNldCAKCSAgICAgKiB0aGF0IHN1bXMgdG8gdGFyZ2V0CgkgICAgICovCgkgICAgCgkgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gdGFyZ2V0OyArK2kpewoJICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBudW1iZXJzLmxlbmd0aDsgKytqKXsKCSAgICAgICAgICAgIC8qIE1hcmsgaW5kZXggaiBhcyBvbmUgb2YgdGhlIG51bWJlcnMgaW4gdGhlIGFycmF5CgkgICAgICAgICAgICAgKiAgd2hpY2ggaXMgcGFydCBvZiB0aGUgc29sdXRpb24gd2l0aCB0aGUgZ2l2ZW4gc3VidGFyZ2V0ICovCgkgICAgICAgICAgICB0YWJsZSBbaV1bal0gPSB0YWJsZVtpXVtqLTFdOwoJICAgICAgICAgICAgaWYgKGkgPj0gbnVtYmVyc1tqLTFdKQoJICAgICAgICAgICAgICAgIHRhYmxlW2ldW2pdID0gdGFibGVbaV1bal0gfHwgdGFibGVbaSAtIG51bWJlcnNbai0xXV0gW2otMV07CgkgICAgICAgIH0KCSAgICB9CgkgICAgCgkgICAgcmV0dXJuIHRhYmxlW3RhcmdldF1bbnVtYmVycy5sZW5ndGhdOwoJfQoJcHJpdmF0ZSBzdGF0aWMgaW50IHN1bShpbnRbXSBudW1iZXJzKSB7CgkJaW50IHM9MDsKCQlmb3IoaW50IGk6bnVtYmVycyl7CgkJCXMrPWk7CgkJfQoJCXJldHVybiBzOwoJfQp9