How to split a list of items into equal partitions according to the item's weight?

后端 未结 3 1628
北海茫月
北海茫月 2021-01-04 10:06

I have a list of items that is somewhat like this:

[
  [\"orange\", 9],
  [\"watermelon\", 3],
  [\"grapefruit\", 6],
  [\"peach\", 8],
  [\"durian\", 2],
           


        
相关标签:
3条回答
  • 2021-01-04 10:33

    It won't work. For example, S = {5, 5, 4, 3, 3}.

    0 讨论(0)
  • 2021-01-04 10:36

    You could total all the weights, divide by the number of groups, come up with a target weight, and then iterate through the items in descending weight order tossing them into the same group if they fit at or under the target weight, and into the other group if they don't.

    There's probably some math dr.s out there who can come up with a formal proof of how best to do it, but that was my thought off the top of my head.

    0 讨论(0)
  • 2021-01-04 10:37

    This is the optimization version of the partition problem, which is NP-complete, although, according to that article, "there are heuristics that solve the problem in many instances, either optimally or approximately."

    The methods section of that article contains a number of ways to do approximate or pseudo-polynomial solutions. Specifically, if you can live with an approximate answer, you could try the greedy approach:

    One approach to the problem, imitating the way children choose teams for a game, is the greedy algorithm, which goes through the numbers in descending order, assigning each of them to whichever subset has the smaller sum.

    The running time of this approach is O(n^2) and is guaranteed to get you to within a factor of 4/3 of the exact solution.

    If you must have an exact solution and your data set is small enough, you could always take a brute force approach of generating every possibility (this is exponential, O(2^n)). Depending on your performance needs, this might be sufficient.

    0 讨论(0)
提交回复
热议问题