algorithm - 公平产品分配算法

标签 algorithm distribution set bin-packing

这是我的问题:

  • 有n家公司分布 产品。
  • 所有产品应在 k 天内分发
  • Ci公司的配货应该是连续的——也就是说它可以在第2、3、4、5天配货,但不能在第2、3、6、7天配货
  • Ci 公司在第 j 天分发的产品数量应小于(或等于)第 j-1 天(如果第 j-1 天有)
  • 第 i 天和第 j 天分发的产品之间的差异不应大于 1

例子:

我们有 3 天的时间分发产品。 A公司的产品:a,a,a,a,a。 B公司的产品:b,b,b。 C公司产品:c,c

公平分配: [aab,aabc,abc]

分配无效: [aabc,aabc,ab] 因为第一天有 4 个产品,第三天有 2 个产品(差异 > 1)

分配无效: [abc,aabc,aab] 因为第一天有一个产品A,第二天有2个产品A,所以产品A的分布不是非递减的

编辑 如果存在无法公平分配的情况,请提供简短说明,我会接受答案

最佳答案

Gareth Rees 对 djna 的回答的评论是正确的——以下反例无法解决:

  • 3 天,A 公司 7 个项目和 B 公司 5 个项目

我使用以下最愚蠢的强力 Perl 程序对此进行了测试(尽管效率非常低,但只用了不到一秒钟的时间):

my ($na, $nb) = (7, 5);
for (my $a1 = 0; $a1 <= $na; ++$a1) {
    for (my $a2 = 0; $a2 <= $na - $a1; ++$a2) {
        my $a3 = $na - $a1 - $a2;
        for (my $b1 = 0; $b1 <= $nb; ++$b1) {
            for (my $b2 = 0; $b2 <= $nb - $b1; ++$b2) {
                my $b3 = $nb - $b1 - $b2;
                if ($a1 >= $a2 && $a2 >= $a3 || $a1 == 0 && $a2 >= $a3 || $a1 == 0 && $a2 == 0) {
                    if ($b1 >= $b2 && $b2 >= $b3 || $b1 == 0 && $b2 >= $b3 || $b1 == 0 && $b2 == 0) {
                        if (max($a1 + $b1, $a2 + $b2, $a3 + $b3) - min($a1 + $b1, $a2 + $b2, $a3 + $b3) <= 1) {
                            print "Success! ($a1,$a2,$a3), ($b1,$b2,$b3)\n";
                        }
                    }
                }
            }
        }
    }
}

请查看并确认我没有犯任何愚蠢的错误。 (为简洁起见,我省略了 max()min() —— 它们只是按照您的预期进行。)

关于algorithm - 公平产品分配算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4132621/

相关文章:

algorithm - 雅可比方法先收敛再发散

string - 等于后缀的前缀数

algorithm - 如何计算分布式系统中大量数据的分布(直方图)?

c++ - 跨源文件模板实例化及使用

python-3.x - 如何使用 scipy optimization 找到 3 个参数和数据点列表的最小卡方?

java - 如何通过 JTable 列元素填充一组元素?

C++ std::set 与自定义 lower_bound

python - 查找重叠的加权多边形 'highest' 区域

java - 将 java.util.Set of <key,value> 对象转换为简单的 pojo 对象

python - 排序线串方向算法