在保持最小值1的同时按给定百分比分配离散数的算法

时间:2014-11-17 12:07:15

标签: algorithm

我需要在给定的百分比列表中分配给定的天数。 我面临的问题是每个小组必须至少获得1天(只要n>总和(g))

n = number of Days to distribute
g_i = number of days for the group with the name i
p_i = wanted percentage for the group with the name i
Sum(g) = number of groups;

所以我的第一步是迭代所有小组,只要有足够的日子就给他们1天。 E.g:

foreach(group)
{
    if(n > 0)
    {
        g_i = 1;
        n = n - 1;
    }
}

现在我不知道接下来该做什么。 我必须根据给定的百分比分配剩余天数,但是percantage是基于原始天数而不是剩余天数。 所以我不得不重新计算百分比,以便它们基于剩余天数而不是原始天数。

编辑: 我想出了以下伪代码:

pd = 1 / n (the percentage for one day)

if(sum(g) == 1)
{
    g_i = n;
}
else if(sum(g) < n)
{
    give every group one day as long as there are days left, starting with the group with the highest percentage
}
else
{
    while(n > 0)
    {
        l = group with lest percentage greater than zero;
        g_l = g_l + 1;
        p_l = p_l - pd;
        n = n - 1;
    }
}

所以基本上我得到的团体百分比最少,分配一天并更新百分比。

有人有更好的答案,我可以改进这个算法:)

1 个答案:

答案 0 :(得分:0)

我会随机分配它们,直到剩余的天数等于空组的数量。

emptyGroups = Sum(g);

// Random assignment
while (n > emptyGroups) {
    i = chooseAGroup();
    if (g_i == 0) emptyGroups--;
    g_i++;
}

// Assign the remaining days to empty groups
foreach(group) {
  if n > 0 && g_i == 0) {
    g_i = 1;
    n--;
  }
}