#include <stdio.h>
#define max(a,b) (a > b ? a : b)
int matrix[100][100] = {0};
int picks[100][100] = {0};
int subset[100];
int knapsack(int nItems, int size, int weights[], int values[]){
int i,j;
for (i=1;i<=nItems;i++){
for (j=0;j<=size;j++){
if (weights[i-1]<=j){
matrix[i][j] = max(matrix[i-1][j],values[i-1]+matrix[i-1][j-weights[i-1]]);
if (values[i-1]+matrix[i-1][j-weights[i-1]]>matrix[i-1][j])
picks[i][j]=1;
else
picks[i][j]=-1;
}
else{
picks[i][j] = -1;
matrix[i][j] = matrix[i-1][j];
}
}
}
return matrix[nItems][size];
}
void printPicks(int item, int size, int weights[]){
int k=0;
while (item>0){
if (picks[item][size]==1){
subset[k++]=item;
item--;
size -= weights[item];
}
else{
item--;
}
}
//Your subset here
for(int i=k-1;i>=0;--i)
printf("%d ",subset[i]);
return;
}
int main(){
int nItems = 3;
int knapsackSize = 11;
int weights[] = {4,10,5};
int values[] = {15,12,8};
printf("Max value = %d\n",knapsack(nItems,knapsackSize,weights,values));
printf("Subset are: ");
printPicks(nItems,knapsackSize, weights);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIG1heChhLGIpIChhID4gYiA/IGEgOiBiKQoKaW50IG1hdHJpeFsxMDBdWzEwMF0gPSB7MH07CmludCBwaWNrc1sxMDBdWzEwMF0gPSB7MH07CmludCBzdWJzZXRbMTAwXTsKaW50IGtuYXBzYWNrKGludCBuSXRlbXMsIGludCBzaXplLCBpbnQgd2VpZ2h0c1tdLCBpbnQgdmFsdWVzW10pewogICAgaW50IGksajsKCiAgICBmb3IgKGk9MTtpPD1uSXRlbXM7aSsrKXsKICAgICAgICBmb3IgKGo9MDtqPD1zaXplO2orKyl7CiAgICAgICAgICAgIGlmICh3ZWlnaHRzW2ktMV08PWopewogICAgICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gbWF4KG1hdHJpeFtpLTFdW2pdLHZhbHVlc1tpLTFdK21hdHJpeFtpLTFdW2otd2VpZ2h0c1tpLTFdXSk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2ktMV0rbWF0cml4W2ktMV1bai13ZWlnaHRzW2ktMV1dPm1hdHJpeFtpLTFdW2pdKQogICAgICAgICAgICAgICAgICAgIHBpY2tzW2ldW2pdPTE7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcGlja3NbaV1bal09LTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIHBpY2tzW2ldW2pdID0gLTE7CiAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaS0xXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF0cml4W25JdGVtc11bc2l6ZV07Cgp9Cgp2b2lkIHByaW50UGlja3MoaW50IGl0ZW0sIGludCBzaXplLCBpbnQgd2VpZ2h0c1tdKXsKCWludCBrPTA7CiAgICB3aGlsZSAoaXRlbT4wKXsKICAgICAgICBpZiAocGlja3NbaXRlbV1bc2l6ZV09PTEpewogICAgICAgICAgICBzdWJzZXRbaysrXT1pdGVtOwogICAgICAgICAgICBpdGVtLS07CiAgICAgICAgICAgIHNpemUgLT0gd2VpZ2h0c1tpdGVtXTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaXRlbS0tOwogICAgICAgIH0KICAgIH0KICAgIC8vWW91ciBzdWJzZXQgaGVyZQogICAgZm9yKGludCBpPWstMTtpPj0wOy0taSkKCQlwcmludGYoIiVkICIsc3Vic2V0W2ldKTsKCgpyZXR1cm47Cn0KCmludCBtYWluKCl7CgppbnQgbkl0ZW1zID0gMzsKICAgIGludCBrbmFwc2Fja1NpemUgPSAxMTsKICAgIGludCB3ZWlnaHRzW10gPSB7NCwxMCw1fTsKICAgIGludCB2YWx1ZXNbXSA9IHsxNSwxMiw4fTsKCiAgICBwcmludGYoIk1heCB2YWx1ZSA9ICVkXG4iLGtuYXBzYWNrKG5JdGVtcyxrbmFwc2Fja1NpemUsd2VpZ2h0cyx2YWx1ZXMpKTsKCiAgICBwcmludGYoIlN1YnNldCBhcmU6ICIpOwoKICAgIHByaW50UGlja3Mobkl0ZW1zLGtuYXBzYWNrU2l6ZSwgd2VpZ2h0cyk7CgoKICAgIHJldHVybiAwOwp9Cg==