#include <iostream>
#include <vector>
using namespace std;
void printKnapsack(const vector<int>& knapsack) {
cout << "[";
for (int x : knapsack) // range for : x will be called for each int in the knapsack vector
cout << x <<" ";
cout<<"]"<<endl;
}
void print_solutions(int current_item, vector<int>& knapsack, int current_sum, const vector<int>& items, int limit) {
//if all items have been processed print the solution and return
if (current_item == items.size() ) {
printKnapsack(knapsack);
return;
};
//don't take the current item and go check others
vector<int> knapcopy = knapsack;
print_solutions(current_item + 1, knapcopy, current_sum, items, limit);
//take the current item if the value doesn't exceed the limit
if (current_sum + items[current_item] <= limit) {
knapsack.push_back(items[current_item]);
current_sum += items[current_item];
//current item taken go check others
print_solutions(current_item + 1, knapsack, current_sum, items, limit);
};
};
int main() {
int current_item = 0;
int current_sum = 0;
int limit, n;
cout << "Type the maximum weight ";
cin >> limit;
cout << "How many items? ";
cin >> n;
vector<int> knapsack; // empty vector
vector<int> items(n); // vector with n elements
cout << "Type weights.";
for (int i = 0; i < n; i++) {
cin >> items[i];
};
print_solutions(0, knapsack, 0, items, limit); // n not needed
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBwcmludEtuYXBzYWNrKGNvbnN0IHZlY3RvcjxpbnQ+JiBrbmFwc2FjaykgewogICAgY291dCA8PCAiWyI7CiAgICBmb3IgKGludCB4IDoga25hcHNhY2spICAgICAgLy8gcmFuZ2UgZm9yIDogeCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBpbnQgaW4gdGhlIGtuYXBzYWNrIHZlY3RvcgogICAgICAgIGNvdXQgPDwgeCA8PCIgIjsKICAgIGNvdXQ8PCJdIjw8ZW5kbDsgCn0KCnZvaWQgcHJpbnRfc29sdXRpb25zKGludCBjdXJyZW50X2l0ZW0sIHZlY3RvcjxpbnQ+JiBrbmFwc2FjaywgaW50IGN1cnJlbnRfc3VtLCBjb25zdCB2ZWN0b3I8aW50PiYgaXRlbXMsIGludCBsaW1pdCkgewogICAgLy9pZiBhbGwgaXRlbXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBwcmludCB0aGUgc29sdXRpb24gYW5kIHJldHVybgogICAgaWYgKGN1cnJlbnRfaXRlbSA9PSBpdGVtcy5zaXplKCkgKSB7CiAgICAgICAgcHJpbnRLbmFwc2FjayhrbmFwc2Fjayk7CiAgICAgICAgcmV0dXJuOwogICAgfTsKCiAgICAvL2Rvbid0IHRha2UgdGhlIGN1cnJlbnQgaXRlbSBhbmQgZ28gY2hlY2sgb3RoZXJzCiAgICB2ZWN0b3I8aW50PiBrbmFwY29weSA9IGtuYXBzYWNrOyAKICAgIHByaW50X3NvbHV0aW9ucyhjdXJyZW50X2l0ZW0gKyAxLCBrbmFwY29weSwgY3VycmVudF9zdW0sIGl0ZW1zLCBsaW1pdCk7CgogICAgLy90YWtlIHRoZSBjdXJyZW50IGl0ZW0gaWYgdGhlIHZhbHVlIGRvZXNuJ3QgZXhjZWVkIHRoZSBsaW1pdAogICAgaWYgKGN1cnJlbnRfc3VtICsgaXRlbXNbY3VycmVudF9pdGVtXSA8PSBsaW1pdCkgewogICAgICAgIGtuYXBzYWNrLnB1c2hfYmFjayhpdGVtc1tjdXJyZW50X2l0ZW1dKTsKICAgICAgICBjdXJyZW50X3N1bSArPSBpdGVtc1tjdXJyZW50X2l0ZW1dOwogICAgICAgIC8vY3VycmVudCBpdGVtIHRha2VuIGdvIGNoZWNrIG90aGVycwogICAgICAgIHByaW50X3NvbHV0aW9ucyhjdXJyZW50X2l0ZW0gKyAxLCBrbmFwc2FjaywgY3VycmVudF9zdW0sIGl0ZW1zLCBsaW1pdCk7CiAgICB9Owp9OwoKCmludCBtYWluKCkgewogICAgaW50IGN1cnJlbnRfaXRlbSA9IDA7CiAgICBpbnQgY3VycmVudF9zdW0gPSAwOwogICAgaW50IGxpbWl0LCBuOwogICAgY291dCA8PCAiVHlwZSB0aGUgbWF4aW11bSB3ZWlnaHQgIjsKICAgIGNpbiA+PiBsaW1pdDsKICAgIGNvdXQgPDwgIkhvdyBtYW55IGl0ZW1zPyAgIjsKICAgIGNpbiA+PiBuOwoKICAgIHZlY3RvcjxpbnQ+IGtuYXBzYWNrOyAgIC8vIGVtcHR5IHZlY3RvcgogICAgdmVjdG9yPGludD4gaXRlbXMobik7ICAgLy8gdmVjdG9yIHdpdGggbiBlbGVtZW50cwoKICAgIGNvdXQgPDwgIlR5cGUgd2VpZ2h0cy4iOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBjaW4gPj4gaXRlbXNbaV07CiAgICB9OwoKICAgIHByaW50X3NvbHV0aW9ucygwLCBrbmFwc2FjaywgMCwgaXRlbXMsIGxpbWl0KTsgIC8vIG4gbm90IG5lZWRlZAoKICAgIHJldHVybiAwOwoKfQ==