#include<stdio.h>
#include<conio.h>
int max(int a, int b) { return (a > b)? a : b; }
int knapSack(int W, int wt[], int pt[], int n){
if (n == 0 || W == 0)
return 0;
if (wt[n-1] > W)
return knapSack(W, wt, pt, n-1);
else return max( pt[n-1] + knapSack(W-wt[n-1], wt, pt, n-1),
knapSack(W, wt, pt, n-1) );
}
/*
//WRITE THIS COMMENTED FUNCTION ONLY IF NEEDED TO UNDERSTAND THE PROCESS OF PICKING
int knapSack(int W, int wt[], int pt[], int n){
int i, w;
int K[MAX_SIZE][MAX_SIZE];
for (i = 0; i <= n; i++){
for (w = 0; w <= W; w++){
if (i==0 || w==0)
K[i][w] = 0;
else if (wt[i-1] <= w)
K[i][w] = max(pt[i-1] + K[i-1][w-wt[i-1]], K[i-1][w]);
else
K[i][w] = K[i-1][w];
}
}
return K[n][W];
}
*/
void main(){
int pt[20],wt[20];
int W;
int n,i,j;
int max_profit;
int knapSacktems[20];
int v[20][20];
clrscr();
printf("\nENTER THE TOTAL NUMBER OF ITEMS TO INCLUDE\n");
scanf("%d",&n);
printf("\nENTER ALL ITEMS WITH ITS WEIGHT AND PROFIT\n");
for(i=0;i<n;i++){
scanf("%d%d",&wt[i],&pt[i]);
knapSacktems[i]=0;
}
printf("\nENTER THE MAXIMUM WEIGHT OF THE BAG\n");
scanf("%d",&W);
printf("Knapsack Tabulation\n\n");
printf("p|w\t");
for(j=0;j<=W;j++){
printf("%d\t",j);
}
printf("\n=====================================================\n");
for(i=0;i<n;i++){
printf("%d|%d\t",pt[i],wt[i]);
for(j=0;j<=W;j++){
v[i][j]=knapSack(j, wt, pt, i+1);
printf("%d\t",v[i][j]);
}
printf("\n");
}
printf("Max profit = %d\n\n",knapSack(W, wt, pt, n));
printf("Items are selected as shown below\n");
max_profit=v[n-1][W];
for(;max_profit>0;){
for(i=0;i<n;i++){
for(j=0;j<=W;j++){
if(v[i][j]==max_profit && max_profit>0){
knapSacktems[i]=1;
max_profit=max_profit-pt[i];
i=-1;
break;
}
}
}
}
for(i=0;i<n;i++){
printf("K %d = %d\n",i+1,knapSacktems[i]);
}
getch();
}