Php 如何实现这种算法?
假设有x个盒子,每个盒子包含字母A-Z的“库存”,每个字母库存为1个或更多 现在,我需要以下信息:Php 如何实现这种算法?,php,algorithm,permutation,combinations,Php,Algorithm,Permutation,Combinations,假设有x个盒子,每个盒子包含字母A-Z的“库存”,每个字母库存为1个或更多 现在,我需要以下信息: 6作为 2 Bs 1 C 我如何获得所有可能组合/排列的方框列表,以提供我所需的字母 该算法还需要生成组合框以满足我的要求。例如:假设Box-1只有4个As,Box-2有1个A,Box-3有1个A,我需要算法的结果来指定6个As可以在3个框中实现 解决这个问题的基本逻辑是什么。有没有什么特别的算法需要我去研究 编辑1: 根据dcp的建议,以下是我对PHP实现的尝试: $boxes = arra
- 6作为
- 2 Bs
- 1 C
$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.
}
}
$box=数组(
//方框1
排列(
“A”=>6,
“B”=>4,
‘C’=>10
),
//方框2
排列(
“A”=>8,
“B”=>4,
‘C’=>2
),
//方框3
排列(
“A”=>1,
“B”=>1,
“C”=>0
)
);
$n=计数($box);
对于($mask=0;$mask如果框的数量非常少,比如说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.
}
}
//假设n是盒子的数量,盒子是盒子的数组
对于(int mask=0;mask如果框的数量非常小,比如说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.
}
}
//假设n是盒子的数量,盒子是盒子的数组
对于(int mask=0;mask@dcp):是否应该有一个变量“box”在您的代码片段中?另外,我不熟悉是的,box是一个box数组,每个数组元素都应该包含给定box的a、b等的数量。对于我来说,这似乎是一个非常好的解决方案,只有一个可能的小问题。如果有限制,您在访问时必须至少拾取一个字母一个方框,此算法将生成违反此规则的排列。例如,如果您只需要x=10个方框中的1个字母,则可以通过访问10个方框中的任何一个来完全满足此要求,因为它们都包含每种字母类型的至少一个实例……但如果访问所有10个方框(掩码=1111),则会“过度满足”,这意味着您在某些框中找不到任何字母。@dcp:我将尝试将您的代码翻译成PHP,这是我正在使用的语言。如果我处理的框数量较大(比如数百个),会怎么样?这会不会太慢?我仍然需要对每个结果组合应用一些计算(但它们很简单,只是一些基本的数学知识)。@dcp:我把你的代码翻译成PHP。它从来没有达到我应该检查tots
变量的程度。我做错什么了吗?@dcp:应该有一个变量“框”吗在您的代码片段中?另外,我不熟悉是的,box是一个box数组,每个数组元素都应该包含给定box的a、b等的数量。对于我来说,这似乎是一个非常好的解决方案,只有一个可能的小问题。如果有限制,您在访问时必须至少拾取一个字母一个方框,此算法将生成违反此规则的排列。例如,如果您只需要x=10个方框中的1个字母,则可以通过访问10个方框中的任何一个来完全满足此要求,因为它们都包含每种字母类型的至少一个实例……但如果访问所有10个方框(掩码=1111),则会“过度满足”,这意味着您在某些框中找不到任何字母。@dcp:我将尝试将您的代码翻译成PHP,这是我正在使用的语言。如果我处理的框数量较大(比如数百个),会怎么样?这会不会太慢?我仍然需要对每个结果组合应用一些计算(但它们非常直截了当,只是一些基本的数学知识)@dcp:我把你的代码翻译成了PHP。它从来没有达到我应该检查tots
变量的程度。我做错了什么吗?你能提供一些背景吗?为什么你想要所有的组合?它似乎没有用,因为在列出案例之后,你没有选择一个的标准。除非是好奇…或homework.@belisarius:选择一个问题不一定要有标准。也许问题在所有确定的组合中都得到了解决。还有,为什么我问这个问题的唯一两个可能的原因必须是“好奇”或“家庭作业?”这难道不是我正在研究的实际问题吗?哦,是的!当然!因为这是一个“给予与索取”的问题网站,我只是要求你分享你问题背后最公开的理由,只是为了帮助其他人认识到你得到的答案可以应用的问题类型。有效的答案是{我的问题是…},{只是好奇},{不关你的事}.最后一个没有多大帮助。你能提供一些背景资料吗?为什么你想要所有的组合?它似乎没有什么用处,因为在列出案例后,你没有选择一个的标准。除非是好奇……或是家庭作业。@belisarius:不必有选择一个的标准。也许所有组合都能解决问题国家确定。还有,为什么我问这个问题的唯一两个可能的原因必须是“好奇”或“家庭作业?”这难道不是我正在研究的实际问题吗?哦,是的!当然!因为这是一个“付出与收获”的问题网站,我只是要求你分享你问题背后最公开的部分,只是为了帮助他人认识到你得到的答案可以应用的问题类型。有效的答案是{我的问题是…},{只是好奇},{不是你的生意}。不过,最后一个没有多大帮助。