Allocate an array of integers proportionally compensating for rounding errors

后端 未结 5 699
暖寄归人
暖寄归人 2021-02-04 12:29

I have an array of non-negative values. I want to build an array of values who\'s sum is 20 so that they are proportional to the first array.

This would be an easy probl

5条回答
  •  闹比i
    闹比i (楼主)
    2021-02-04 13:28

    A naïve solution that doesn't perform well, but will provide the right result...

    Write an iterator that given an array with eight integers (candidate) and the input array, output the index of the element that is farthest away from being proportional to the others (pseudocode):

    function next_index(candidate, input)
        // Calculate weights
        for i in 1 .. 8
            w[i] = candidate[i] / input[i]
        end for
        // find the smallest weight
        min = 0
        min_index = 0
        for i in 1 .. 8
            if w[i] < min then
                min = w[i]
                min_index = i
            end if
        end for
    
        return min_index
     end function
    

    Then just do this

    result = [0, 0, 0, 0, 0, 0, 0, 0]
    result[next_index(result, input)]++ for 1 .. 20
    

    If there is no optimal solution, it'll skew towards the beginning of the array.

    Using the approach above, you can reduce the number of iterations by rounding down (as you did in your example) and then just use the approach above to add what has been left out due to rounding errors:

    result = <>
    while sum(result) < 20
        result[next_index(result, input)]++
    

提交回复
热议问题