Php 如何实现这种算法?

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

假设有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 = 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:不必有选择一个的标准。也许所有组合都能解决问题国家确定。还有,为什么我问这个问题的唯一两个可能的原因必须是“好奇”或“家庭作业?”这难道不是我正在研究的实际问题吗?哦,是的!当然!因为这是一个“付出与收获”的问题网站,我只是要求你分享你问题背后最公开的部分,只是为了帮助他人认识到你得到的答案可以应用的问题类型。有效的答案是{我的问题是…},{只是好奇},{不是你的生意}。不过,最后一个没有多大帮助。