1

My code is as the following:

    #include<stdio.h>
     int max(int a,int b)
{
        return a>b?a:b;
}
int Knapsack(int items,int weight[],int value[],int maxWeight)
{
        int dp[items+1][maxWeight+1];
        /* dp[i][w] represents maximum value that can be attained if the maximum weight is w and
           items are chosen from 1...i */
        /* dp[0][w] = 0 for all w because we have chosen 0 items */
        int iter,w;
        for(iter=0;iter<=maxWeight;iter++)
        {
                dp[0][iter]=0;
        }
        /* dp[i][0] = 0 for all w because maximum weight we can take is 0 */
        for(iter=0;iter<=items;iter++)
        {
                dp[iter][0]=0;
        }
        for(iter=1;iter<=items;iter++)
        {
                for(w=0;w<=maxWeight;w=w+1)
                {
                        dp[iter][w] = dp[iter-1][w]; /* If I do not take this item */
                        if(w-weight[iter] >=0)
                        {
                                /* suppose if I take this item */
                                dp[iter][w] = max( (dp[iter][w]) , (dp[iter-1][w-weight[iter]])+value[iter]);
                        }
                }

        }
        return dp[items][maxWeight];
}
int main()
{
        int items=9;
        int weight[/*items+1*/10]={60, 10, 20, 20, 20, 20, 10, 10, 10};
        int value[/*items+1*/10]={73, 81, 86, 72, 90, 77, 85, 70, 87};
        int iter;
        int i;

        int maxWeight=180;

        for (i=0;i<10;i++){
            value[i] = value[i]*weight[i];
        }

        printf("Max value attained can be %d\n",Knapsack(items,weight,value,maxWeight));
}

My knapsack code is working when

items=12;
int weight[/*items+1*/13]={60, 20, 20, 20, 10, 20, 10, 10, 10, 20, 20, 10};
int value[/*items+1*/13]={48, 77, 46, 82, 85, 43, 49, 73, 65, 48, 47, 51};

where it returned the correct output 7820.

But it doesn't returned the correct output when

items=9;
int weight[/*items+1*/10]={60, 10, 20, 20, 20, 20, 10, 10, 10};
int value[/*items+1*/10]={73, 81, 86, 72, 90, 77, 85, 70, 87};

where it returned the output 9730, the correct output should be 14110. From observation, the program somehow skipped the 1st value (weight=60, value =73). I have checked the code several times, but I just cant find what's wrong. Can someone explain to me why? Thank you!

Voyage_Mystere
  • 159
  • 1
  • 12

2 Answers2

1

In your code, you are trying to access out of bounds index for weight and value array. When iter reaches value 9, weight[iter] and value[iter] becomes out of bounds index. I guess, in C you simply get some garbage value for out of index access, but in Java, that will throw an exception. Change the code in your inner for loop to:

dp[iter][w] = dp[iter-1][w]; /* If I do not take this item */
if(w-weight[iter - 1] >=0)
{
    /* suppose if I take this item */
    dp[iter][w] = maximum( (dp[iter][w]) , (dp[iter-1][w-weight[iter - 1]])+value[iter - 1]);
}

and it will work fine.

Rohit Jain
  • 209,639
  • 45
  • 409
  • 525
  • Thanks now it's working perfectly! But I would like to have an explanation (I don't understand -- before it was comparing the value of same iteration, but now it is comparing the value of the current iteration with the previous one) – Voyage_Mystere Dec 25 '13 at 13:59
0
int weight[/*items+1*/10]={60, 10, 20, 20, 20, 20, 10, 10, 10};
int value[/*items+1*/10]={73, 81, 86, 72, 90, 77, 85, 70, 87};

Your arrays are of length 10, but you are filling only 9 entries. Hence the last entry gets filled to 0. How to initialize all members of an array to the same value?

int weight[/*items+1*/10]={60, 10, 20, 20, 20, 20, 10, 10, 10, 0};
int value[/*items+1*/10]={73, 81, 86, 72, 90, 77, 85, 70, 87, 0};

But you are trying to access the indices (1 to 9) in your algorithm.

Instead try filling all entries:

int weight[/*items+1*/10]={0, 60, 10, 20, 20, 20, 20, 10, 10, 10};
int value[/*items+1*/10]={0, 73, 81, 86, 72, 90, 77, 85, 70, 87};

EDIT:
The first case gives correct output since in that case the first entry is not included in the optimal solution.

Community
  • 1
  • 1
Abhishek Bansal
  • 12,589
  • 4
  • 31
  • 46