Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Knapsack algorithm with 2 properties. How to implement that in a 3d array?

I'm having a problem with understanding knapsack problem when there's more than 1 property. When there's 1 property,

I have to write a program that uses knapsack algorithm with a 2 properties. Teacher told us, It has to be done in a 3d array. Wrong implementation will lead to O(2^n) processing time. I can't imagine how would such array look like.

Let's say here's my input:

4 3 4 // number of records below, 1st property of backpack, 2nd property  of backpack
1 1 1 // 1st property, 2nd property, cost
1 2 2 // 1st property, 2nd property, cost
2 3 3 // 1st property, 2nd property, cost
3 4 5 // 1st property, 2nd property, cost

And the output would look like that:

4    // the cheapest sum of costs of 2 records
1 3  // numbers of these 2 records

The explanation of output: 2 sets of records fit's into 1'st line of input:

(1) - record number 1 and record number 3

  1 1 1
+ 2 3 3
-------
  3 4 4

(2) - record number 4

  3 4 5

Because 1st set of the records is the cheapest (4 < 5), we chose it. Not only I'll have to find out whether such set of records exists, I'll also have to find records I've summed.

But for now, I only need to understand, how will 3d array look like. Could some of You help me out with that and show, layer by layer, just like in my image, how would this look like? Thanks.

like image 729
Paulina Avatar asked Nov 18 '12 22:11

Paulina


People also ask

What are the 2 categories of a knapsack problems?

In this problem, we are given a set of items having different weights and values. We have to find the optimal solution considering all the given items. There are three types of knapsack problems : 0-1 Knapsack, Fractional Knapsack and Unbounded Knapsack. In this article, we will discuss 0-1 Knapsack in detail.

What are the two ways to solve a fractional knapsack problem?

There are basically three approaches to solve the problem: The first approach is to select the item based on the maximum profit. The second approach is to select the item based on the minimum weight. The third approach is to calculate the ratio of profit/weight.

What is knapsack algorithm with example?

For example, we have two items having weights 2kg and 3kg, respectively. If we pick the 2kg item then we cannot pick 1kg item from the 2kg item (item is not divisible); we have to pick the 2kg item completely. This is a 0/1 knapsack problem in which either we pick the item completely or we will pick that item.


1 Answers

To convert from the algorithm to solve the 1-constraint knapsack problem with dynamic programming to solving the 2-constraint problem is very easy. For someone to draw a 3d image that shows you what's happening there I imagine is somewhat difficult. The algorithm, on the other hand, is quite easy:

I'll assume you want an exact-fit solution, and that you want to minimize cost, not maximize value (which I derived from your example). I've done neither of these variations before, so I can't guarantee there isn't an error.

1-constraint

The matrix for the 1-constraint knapsack problem is (item x weight) storing the value at each position.

The algorithm is basically:

// WL = backpack weight limit
A[0, 0] = 0
for w = 1, 2, ..., WL // weight
  A[0, w] = INFINITY
for i = 1, 2, ..., n // items
  for w = 0, 1, ..., WL // weight
    // wi and ci are the weight and cost of the item respectively
    // A[i-1, w-wi] + ci = 0 when wi > w
    A[i, w] = min(A[i-1, w], A[i-1, w-wi] + ci)

2-constraint

Now to extend this to the include another constraint is just: (let's say size is the other constraint)

The matrix would be (item x weight x size).

// WL = backpack weight limit
// SL = backpack size limit
for w = 0, 1, ..., WL // weight
  for s = 0, 1, ..., SL // size
    A[0, w, s] = INFINITY
A[0, 0, 0] = 0
for i = 1, 2, ..., n // items
  for w = 0, 1, ..., WL // weight
    for s = 0, 1, ..., SL // size
      // wi, si and ci are the weight, size and cost of the item respectively
      // A[i-1, w-wi, s-si] + ci = 0 when wi > w or si > s
      A[i, w, s] = min(A[i-1, w, s], A[i-1, w-wi, s-si] + ci)
like image 139
Bernhard Barker Avatar answered Sep 20 '22 14:09

Bernhard Barker