AmericanPsycho's blog

By AmericanPsycho, history, 9 years ago, In English

Hi everyone

I need help with this knapsack variant
Thanks

  • Vote: I like it
  • +5
  • Vote: I do not like it

»
9 years ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

I cant figure out anything from hint but can share my approach. Just make multiple copies of the coin.

Say W={5,4} and K={2,3} then modify W as W1={5,5,4,4,4} and V as V1={100,100,70,70,70}. Forget K now.

Build dp table as dp[i][j]=minimum cost to get sum of j using first i coins. Complexity: O(S*sum(Ki)). You can do it in O(S) space.

»
9 years ago, hide # |
Rev. 4  
Vote: I like it +7 Vote: I do not like it

For each object X, split its K_i copies into different objects with weight (2^a)*W_i and value (2^a)*V_i, where all the of 2^a of a particular X sum to K_i.

This probably seems a bit vague, so let me show some examples:

Object With 5 Copies: Split it into 3 objects with the weight of 1 copy, 2 copies, and 2 copies, allowing someone to take anywhere between 0 and 5 copies (we can easily see why 2 objects with the weight of 1 copy and 4 copies will not work).

Object With 12 Copies: Split it into 5 objects with the weight of 1 copy, 1 copy, 2 copies, 4 copies, and 4 copies.

We initially start with freq[1] = K_i, and loop for powers of 2 until we encounter freq[i] = 0 to split up the object's copies.

int numPairs = (freq[i]-1)/2;
freq[2*i] += numPairs; freq[i] -= numPairs*2;

We now have a complexity of S*sqrt(sum of K_i).

EDIT: BTW @AmericanPsycho what book is this?