2010-11-20 209 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