用约束划分数组之间的对象

时间:2017-09-22 10:11:18

标签: arrays algorithm math set

我们假设我们有一组对象a1,a2,...和

我们有空数组g1,g2,... gm,每个数组可能只包含一些对象,并且必须包含特定数量的对象,例如:

  • g1可以包含[a1,a5,a8]必须包含2个对象
  • g2可以包含[a5,a6,a7,a9,a10]必须包含3个对象
  • ...
  • gm可以包含[a1,a6,a8,a10]必须包含4个对象

检查是否可以在数组之间分配对象(没有必要使用所有对象)以及上述约束,并尽可能获得该分布,最好的算法是什么?

2 个答案:

答案 0 :(得分:2)

这是一个流程问题

  1. 假设我们有一个Source S,它对每个Ai有一个边缘,容量= 1
  2. 如果Gj可以包含Ai,则从Ai到Gj有一个边缘。容量将等于1

  3. 它们是从每个Gj到Sink的边缘,其容量等于它必须具有的值。

  4. 现在,如果我们运行最大流量,每个Ai将被映射到Gj。总流量应等于从Gj到下沉的权重之和。
  5. 如果总和有效,那么只需获取流中的映射。否则它无效

答案 1 :(得分:0)

n 为对象总数, m 为数组总数。

x=n;
y=m+1;
arangement_possible=true;
while(y>=2)
{
   if(x<=0)
   {
      arrangement_possible = false;
      break;
    }
   x=x-y;
   y=y-1;
 }

如果arrange_possible为真,那么这种安排也是可能的。

chk for this condition

<(>((m(m + 1))/ 2)-1)&lt; = n