【问题标题】:How to implement such an algorithm?如何实现这样的算法?
【发布时间】:2010-11-20 02:40:22
【问题描述】:

假设有 x 个盒子,每个盒子包含一个字母 A-Z 的“库存”,每个字母库存为 1 个或更多。

现在说我需要以下内容:

  • 6 为
  • 2 Bs
  • 1 C

如何获得可以为我提供所需字母的所有可能组合/排列的框的列表?

该算法还需要生成框组合以满足我的要求。例如:假设 Box-1 只有 4 个 A,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.
    }
}

【问题讨论】:

  • 您能提供一些背景资料吗?为什么要所有组合?它似乎没有用,因为在列出案例后,您没有选择一个标准。除非是好奇……或作业。
  • @belisarius:不必有一个标准来选择一个。也许通过确定所有组合来解决问题。另外,为什么我问这个问题的唯一两个可能的原因是“好奇”或“家庭作业”?这难道不是我正在解决的实际问题吗?
  • 哦,是的!当然!由于这是一个“互惠互利”的网站,我只是要求您分享您的问题背后最公开的部分理由,只是为了帮助其他人认识到您得到的答案可以应用的问题类型。有效答案是{我的问题是...}、{只是好奇}、{不是你的事}。不过,最后一点帮助不大。

标签: php algorithm permutation combinations


【解决方案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.
  }
}

【讨论】:

  • @dcp: 你的 sn-p 中应该有一个变量“boxes”吗?另外,我不熟悉&lt;&lt; 符号;这是什么意思?
  • 是的,boxes 是一个盒子数组,每个数组元素都应该包含给定盒子的 a、b 等的数量。
  • 这对我来说似乎是一个很好的解决方案,只有一个可能的小问题。如果您在访问一个盒子时必须至少拾取一个字母,则此算法将生成违反此规则的排列。例如。如果您只需要 x=10 个盒子中的 1x 个字母,则可以通过访问 10 个盒子中的任何一个来完全满足这一点,因为它们都包含每种字母类型的至少一个实例……但是通过访问它会“过度满足”所有 10 个盒子 (mask=1111111111),这意味着您没有在某些盒子上捡起任何字母。
  • @dcp:我会尝试将您的代码翻译成 PHP,这是我正在使用的语言。如果我要处理大量的盒子——比如说几百个呢?这会不会太慢?我仍然需要对每个结果组合应用一些计算(但它们非常简单,只是一些基本的数学知识)。
  • @dcp:我将您的代码翻译成 PHP。它从来没有达到我应该检查tots变量的地步。我是不是做错了什么?
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多