假设有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.
}
}
你能提供一些背景吗?为什么你想要所有的组合?这似乎并不有用,因为在列出案例之后,您没有选择标准的条件。除非是好奇心......或作业。 – 2010-11-20 05:31:46
@belisarius:不一定要有一个标准来选择一个。也许问题解决了所有确定的组合。另外,为什么我要问这个问题的唯一两个可能的原因是“好奇心”还是“功课”?难道这不是我正在处理的实际问题吗? – StackOverflowNewbie 2010-11-20 08:25:40
哦,是的!当然!由于这是一个“给予和承担”的网站,我只是要求你分享你的问题背后的理论基础的最公开的部分,只是为了帮助其他人认识到你所得到的答案可以被应用的那种问题。有效的答案是{我的问题是...},{只是好奇},{不是您的业务}。尽管如此,最后一点也没有多大帮助。 – 2010-11-20 15:21:14