#include <stdio.h>
int count_combinations(
int itemCosts[]
, size_t costCount
, int pickedItems[]
, size_t pickedCount
, size_t pickedTargetCount
, size_t minIndex
, int funds
) {
if (pickedCount == pickedTargetCount) {
// This is the base case. It has the code similar to
// the "if" statement from your code, but the number of items
// is not fixed.
int sum = 0;
for (size_t i = 0 ; i != pickedCount ; i++) {
sum += pickedItems[i];
}
if (sum <= funds) {
for (size_t i = 0 ; i != pickedCount ; i++) {
printf("%d ", pickedItems
[i
]); }
}
// The following line will return 0 or 1,
// depending on the result of the comparison.
return sum <= funds;
} else {
// This is the recursive case. It is similar to one of your "for"
// loops, but instead of setting "one", "two", or "three"
// it sets pickedItems[0], pickedItems[1], etc.
int res = 0;
for (size_t i = minIndex ; i != costCount ; i++) {
pickedItems[pickedCount] = itemCosts[i];
res += count_combinations(
itemCosts
, costCount
, pickedItems
, pickedCount+1
, pickedTargetCount
, i+1
, funds
);
}
return res;
}
}
int main(void) {
int itemCosts[] = {1, 3, 5, 7}; // The costs
int pickedItems[2]; // No need to initialize this array
int res = count_combinations(itemCosts, 4, pickedItems, 0, 2, 0, 8);
printf("Got %d combinations\n", res
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgY291bnRfY29tYmluYXRpb25zKAogICAgaW50IGl0ZW1Db3N0c1tdCiwgICBzaXplX3QgY29zdENvdW50CiwgICBpbnQgcGlja2VkSXRlbXNbXQosICAgc2l6ZV90IHBpY2tlZENvdW50CiwgICBzaXplX3QgcGlja2VkVGFyZ2V0Q291bnQKLCAgIHNpemVfdCBtaW5JbmRleAosICAgaW50IGZ1bmRzCikgewogICAgaWYgKHBpY2tlZENvdW50ID09IHBpY2tlZFRhcmdldENvdW50KSB7CiAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmFzZSBjYXNlLiBJdCBoYXMgdGhlIGNvZGUgc2ltaWxhciB0bwogICAgICAgIC8vIHRoZSAiaWYiIHN0YXRlbWVudCBmcm9tIHlvdXIgY29kZSwgYnV0IHRoZSBudW1iZXIgb2YgaXRlbXMKICAgICAgICAvLyBpcyBub3QgZml4ZWQuCiAgICAgICAgaW50IHN1bSA9IDA7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpICE9IHBpY2tlZENvdW50IDsgaSsrKSB7CiAgICAgICAgICAgIHN1bSArPSBwaWNrZWRJdGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgaWYgKHN1bSA8PSBmdW5kcykgewogICAgICAgIAlmb3IgKHNpemVfdCBpID0gMCA7IGkgIT0gcGlja2VkQ291bnQgOyBpKyspIHsKICAgICAgICAgICAgICAgIHByaW50ZigiJWQgIiwgcGlja2VkSXRlbXNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIHdpbGwgcmV0dXJuIDAgb3IgMSwKICAgICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4KICAgICAgICByZXR1cm4gc3VtIDw9IGZ1bmRzOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWN1cnNpdmUgY2FzZS4gSXQgaXMgc2ltaWxhciB0byBvbmUgb2YgeW91ciAiZm9yIgogICAgICAgIC8vIGxvb3BzLCBidXQgaW5zdGVhZCBvZiBzZXR0aW5nICJvbmUiLCAidHdvIiwgb3IgInRocmVlIgogICAgICAgIC8vIGl0IHNldHMgcGlja2VkSXRlbXNbMF0sIHBpY2tlZEl0ZW1zWzFdLCBldGMuCiAgICAgICAgaW50IHJlcyA9IDA7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IG1pbkluZGV4IDsgaSAhPSBjb3N0Q291bnQgOyBpKyspIHsKICAgICAgICAgICAgcGlja2VkSXRlbXNbcGlja2VkQ291bnRdID0gaXRlbUNvc3RzW2ldOwogICAgICAgICAgICByZXMgKz0gY291bnRfY29tYmluYXRpb25zKAogICAgICAgICAgICAgICAgaXRlbUNvc3RzCiAgICAgICAgICAgICwgICBjb3N0Q291bnQKICAgICAgICAgICAgLCAgIHBpY2tlZEl0ZW1zCiAgICAgICAgICAgICwgICBwaWNrZWRDb3VudCsxCiAgICAgICAgICAgICwgICBwaWNrZWRUYXJnZXRDb3VudAogICAgICAgICAgICAsICAgaSsxCiAgICAgICAgICAgICwgICBmdW5kcwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQp9CgoKaW50IG1haW4odm9pZCkgewoJaW50IGl0ZW1Db3N0c1tdID0gezEsIDMsIDUsIDd9OyAvLyBUaGUgY29zdHMKICAgIGludCBwaWNrZWRJdGVtc1syXTsgLy8gTm8gbmVlZCB0byBpbml0aWFsaXplIHRoaXMgYXJyYXkKICAgIGludCByZXMgPSBjb3VudF9jb21iaW5hdGlvbnMoaXRlbUNvc3RzLCA0LCBwaWNrZWRJdGVtcywgMCwgMiwgMCwgOCk7CiAgICBwcmludGYoIkdvdCAlZCBjb21iaW5hdGlvbnNcbiIsIHJlcyk7CglyZXR1cm4gMDsKfQo=