【发布时间】: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