【问题标题】:Distributing n objects among p groups of q members在 p 组 q 个成员中分配 n 个对象
【发布时间】:2017-08-31 16:59:56
【问题描述】:

我无法找到这个确切问题的答案:

给定n 对象为n 一个至少为2 的整数,我需要在p 大于或等于2 和n 大于或等于@987654326 的p 组之间平均分配它们@,其中,“平等”是指:每个组包含q 成员; q 至少 1。组的成员数量决定了组的“权重”,因为应该分配 n 对象,以便更大的组(即更多成员)获得更多对象。但是,每个组必须至少收到一个对象。

示例:给定n=5 对象和两个组p_1 和p_2 以及q_1=1 和q_2=9,p_1 得到1 个对象和p_2 4 个。

【问题讨论】:

  • ...问题是,“有没有实现这种分布的算法?”。
  • 输入是什么?您要指定 n 和 p?需要明确的是,听起来“平等”并不重要。即组的大小不同?
  • 我不清楚 q_2 = 9 在您的示例中是什么意思?
  • 分配应根据由成员数量确定的组的“大小”。输入是 n、p_i(i 个组)和 q_i(组 p_i 的 q 个成员)。 q_2=9 表示组 p_2 的 9 个成员。

标签: algorithm math


【解决方案1】:

你的问题不是很清楚。你可能想要这个:

// add 1 to each group and subtract from n
for (int i = 0; i < p; ++i)
    group[i] = 1;
n -= p;

while (n > 0)
{
    // find i, such that q[i] / group[i] is maximum
    int imax = 0;
    double max = q[0] / group[0];
    for (int i = 1; i < p; ++i)
    {
        if (q[i] / group[i] > max)
        {
            max = q[i] / group[i];
            imax = i;
        }
    }
    ++group[imax];
    --n;
}

见https://en.wikipedia.org/wiki/D%27Hondt_method

【讨论】:

  • 是的,我相信这正是我想要的。
【解决方案2】:

首先,不要求每个组必须至少有一个对象:

统一绘制1到sum(q_n)=q_1+q_2+...+q_n之间的整数

如果整数介于sum(q_i) 和sum(q_{i+1}) 之间,则将一个对象添加到组i。

现在要确保每个组都有一个对象,只需向每个组添加一个对象(它不会改变加权分布)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2011-04-04
    • 1970-01-01
    • 2022-11-17
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多