2010-11-20 157 views
1

假设有x个盒子,每个盒子包含一个字母A-Z的“库存”,每个字母库存为1或更多。如何实现这样的算法?

现在说我需要以下条件:

  • 6作为
  • 2烧烤
  • 图1C

我如何获得的箱子所有可能的组合/排列的列表那可以给我提供我需要的信件?

该算法还需要生成盒子的组合以满足我的要求。例如:如果Box-1只有4个As并且Box-2有1个A并且Box-3有1个A,那么我需要算法的结果来指定6个As可以在3个盒子之间实现。

解决这个问题的基本逻辑是什么。有什么特别的算法我需要为此进行研究吗?

编辑1:

每DCP的建议,这里是我的尝试是,PHP实现:

$boxes = array(
    // box 1 
    array(
     'A' => 6, 
     'B' => 4, 
     'C' => 10 
    ), 
    // box 2 
    array(
     'A' => 8, 
     'B' => 4, 
     'C' => 2 
    ), 
    // box 3 
    array(
     'A' => 1, 
     'B' => 1, 
     'C' => 0 
    ) 
); 

$n = count($boxes); 

for ($mask = 0; $mask <= (1 << $n) - 1; $mask++) 
{ 
    $tots = array(); 
    for ($i = 0; $i < $n; $i++) 
    { 
     if (((1 << $i) & $mask) != 0) 
     { 
      // this is a selected box for this mask, add the A's, B's etc. for this box to the total 
      $tots[0] += $boxes[$i]['A']; 
      $tots[1] += $boxes[$i]['B']; 
      $tots[2] += $boxes[$i]['C']; 
     } 
     // check the tots array to see if it meets the letter requirements. If it does, 
     // then this is a valid combination of boxes. 
    } 
} 
+0

你能提供一些背景吗?为什么你想要所有的组合?这似乎并不有用,因为在列出案例之后,您没有选择标准的条件。除非是好奇心......或作业。 – 2010-11-20 05:31:46

+0

@belisarius:不一定要有一个标准来选择一个。也许问题解决了所有确定的组合。另外,为什么我要问这个问题的唯一两个可能的原因是“好奇心”还是“功课”?难道这不是我正在处理的实际问题吗? – StackOverflowNewbie 2010-11-20 08:25:40

+0

哦,是的!当然!由于这是一个“给予和承担”的网站,我只是要求你分享你的问题背后的理论基础的最公开的部分,只是为了帮助其他人认识到你所得到的答案可以被应用的那种问题。有效的答案是{我的问题是...},{只是好奇},{不是您的业务}。尽管如此,最后一点也没有多大帮助。 – 2010-11-20 15:21:14

回答

1

如果箱子的数量是相当小的,说25或更低,则可以在所有可能的盒子组合上使用位图蛮力:

// assume n is number of boxes, and boxes is the array of boxes 
for(int mask = 0; mask <= (1<<n)-1; ++mask) { 
    int tots[26]; 
    for(int i = 0; i < n; ++i) { 
    if (((1<<i)&mask) != 0) { 
     // this is a selected box for this mask, add the A's, B's etc. for this box to the total 
     tots[0] += number of A's in box i 
     tots[1] += number of B's in box i 
     . 
     . 
    } 
    // check the tots array to see if it meets the letter requirements. If it does, 
    // then this is a valid combination of boxes. 
    } 
} 
+0

@dcp:是否应该在您的代码段中有一个变量“框”?另外,我不熟悉'<<'符号;这是什么意思? – StackOverflowNewbie 2010-11-20 03:22:57

+0

是的,盒子是盒子的数组,每个数组元素应该包含给定盒子的a,b等的数量。 <<符号左移1位。 (1 << n)-1表示所有被选中的方框(所以如果你有10个方框,这个数字就是(2^n)-1),你可以把1 << n和2^n看作相同的,因为他们是 :)。 – dcp 2010-11-20 03:37:22

+0

这对我来说似乎是一个很好的解决方案,只有一个小问题。如果有一个约束条件,在访问一个盒子时必须至少拾取一个字母,此算法将生成违反此操作的排列。例如。如果你只需要1x x = 10个盒子的信件,这可以通过访问10个盒子中的任何一个来完全满足,因为它们全部包含每个字母类型的至少一个实例...但是通过访问会“过度满意”所有10个盒子(面具= 1111111111),这意味着你没有拿起任何字母在一些框。 – 2010-11-20 03:56:04