AmericanPsycho's blog

By AmericanPsycho, history, 7 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

»
7 years ago, # |
  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.

»
7 years ago, # |
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?

  • »
    »
    7 years ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    This book is Competitive Programming 3.

  • »
    »
    7 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    How is the square root coming?

    • »
      »
      »
      7 years ago, # ^ |
        Vote: I like it +4 Vote: I do not like it

      Because 0 <= freq[i] <= 2 and the number of different freqs >= 1 will be O(sqrt(k)) since the sum of the first k natural numbers is O(k^2).