我需要在给定的百分比列表中分配给定的天数。 我面临的问题是每个小组必须至少获得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;
}
}
所以基本上我得到的团体百分比最少,分配一天并更新百分比。
有人有更好的答案,我可以改进这个算法:)
答案 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--;
}
}