Блог пользователя AmericanPsycho

Автор AmericanPsycho, история, 7 лет назад, По-английски

Hi everyone

I need help with this knapsack variant
Thanks

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

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.

»
7 лет назад, # |
Rev. 4   Проголосовать: нравится +7 Проголосовать: не нравится

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?