// Returns true if there exists a subset
// with given sum in arr[]
#include <stdio.h>
#include <stdbool.h>
bool isSubsetSum(int arr[], int n, int sum)
{
// The value of subset[i%2][j] will be true
// if there exists a subset of sum j in
// arr[0, 1, ...., i-1]
bool subset[2][sum + 1];
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= sum; j++) {
// A subset with sum 0 is always possible
if (j == 0)
subset[i % 2][j] = true;
// If there exists no element no sum
// is possible
else if (i == 0)
subset[i % 2][j] = false;
else if (arr[i - 1] <= j)
subset[i % 2][j] = subset[(i + 1) % 2]
[j - arr[i - 1]] || subset[(i + 1) % 2][j];
else
subset[i % 2][j] = subset[(i + 1) % 2][j];
}
}
return subset[n % 2][sum];
}
// Driver code
int main()
{
int arr[] = { 6, 2, 5 };
int sum = 7;
int n = sizeof(arr) / sizeof(arr[0]);
if (isSubsetSum(arr, n, sum) == true)
printf("There exists a subset with given sum");
else
printf("No subset exists with given sum");
return 0;
}
Ly8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGV4aXN0cyBhIHN1YnNldCAKLy8gd2l0aCBnaXZlbiBzdW0gaW4gYXJyW10gCiNpbmNsdWRlIDxzdGRpby5oPiAKI2luY2x1ZGUgPHN0ZGJvb2wuaD4gCgpib29sIGlzU3Vic2V0U3VtKGludCBhcnJbXSwgaW50IG4sIGludCBzdW0pIAp7IAoJLy8gVGhlIHZhbHVlIG9mIHN1YnNldFtpJTJdW2pdIHdpbGwgYmUgdHJ1ZSAKCS8vIGlmIHRoZXJlIGV4aXN0cyBhIHN1YnNldCBvZiBzdW0gaiBpbiAKCS8vIGFyclswLCAxLCAuLi4uLCBpLTFdIAoJYm9vbCBzdWJzZXRbMl1bc3VtICsgMV07IAoKCWZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgeyAKCQlmb3IgKGludCBqID0gMDsgaiA8PSBzdW07IGorKykgeyAKCgkJCS8vIEEgc3Vic2V0IHdpdGggc3VtIDAgaXMgYWx3YXlzIHBvc3NpYmxlIAoJCQlpZiAoaiA9PSAwKSAKCQkJCXN1YnNldFtpICUgMl1bal0gPSB0cnVlOyAKCgkJCS8vIElmIHRoZXJlIGV4aXN0cyBubyBlbGVtZW50IG5vIHN1bSAKCQkJLy8gaXMgcG9zc2libGUgCgkJCWVsc2UgaWYgKGkgPT0gMCkgCgkJCQlzdWJzZXRbaSAlIDJdW2pdID0gZmFsc2U7IAoJCQllbHNlIGlmIChhcnJbaSAtIDFdIDw9IGopIAoJCQkJc3Vic2V0W2kgJSAyXVtqXSA9IHN1YnNldFsoaSArIDEpICUgMl0gCgkJCVtqIC0gYXJyW2kgLSAxXV0gfHwgc3Vic2V0WyhpICsgMSkgJSAyXVtqXTsgCgkJCWVsc2UKCQkJCXN1YnNldFtpICUgMl1bal0gPSBzdWJzZXRbKGkgKyAxKSAlIDJdW2pdOyAKCQl9IAoJfSAKCglyZXR1cm4gc3Vic2V0W24gJSAyXVtzdW1dOyAKfSAKCi8vIERyaXZlciBjb2RlIAppbnQgbWFpbigpIAp7IAoJaW50IGFycltdID0geyA2LCAyLCA1IH07IAoJaW50IHN1bSA9IDc7IAoJaW50IG4gPSBzaXplb2YoYXJyKSAvIHNpemVvZihhcnJbMF0pOyAKCWlmIChpc1N1YnNldFN1bShhcnIsIG4sIHN1bSkgPT0gdHJ1ZSkgCgkJcHJpbnRmKCJUaGVyZSBleGlzdHMgYSBzdWJzZXQgd2l0aCBnaXZlbiBzdW0iKTsgCgllbHNlCgkJcHJpbnRmKCJObyBzdWJzZXQgZXhpc3RzIHdpdGggZ2l2ZW4gc3VtIik7IAoJcmV0dXJuIDA7IAp9IAo=