当前位置: 首页 > 知识库问答 >
问题:

所有可能的组合,如何制作图案?.PHP?

欧阳勇军
2023-03-14

我正在做一个代码,可以消除不需要的组合,例如我(ABCDE)不想要AAA BBB AB BA只想要ABC ABD ABE ....等等,希望它在任何情况下都有效,我这样做的示例代码:他制作了一组组合 (1-6) 3 对 3 ...但我希望他 (1-15) 与 4 对 4 或 10 到 10 的组合......请参阅示例以更好地理解。

$lista = array(1,2,3,4,5,6);
$b=1;
for ($i=0; $i<=3; $i++) {
    for ($j=$b; $j<=4;$j++) {
    //  printf('valor do j = '.$j.'<br>');
        for ($k=$j+1; $k<count($lista); $k++) {
            printf($lista[$i].$lista[$j].$lista[$k].'<br>');
        }
    }
    $b++;
}

结果

123
124
125
126
134
135
136
145
146
156
234
235
236
245
246
256
345
346
356
456

共有3个答案

濮阳耀
2023-03-14

我已经编写了一个类来处理处理二项式系数的常见函数,这是您的问题所属的问题类型。它执行以下任务:

>

  • 以良好的格式输出所有K索引,以供N选择K到文件。K索引可以用更具描述性的字符串或字母替换。这种方法使得解决这类问题变得非常简单。

    将K索引转换为已排序二项式系数表中某个条目的正确索引。该技术比依赖迭代的旧的已发布技术快得多。它通过使用帕斯卡三角中固有的数学特性来实现这一点。我的论文中谈到了这一点。我相信我是第一个发现并发表这项技术的人,但我可能错了。

    将排序的二项式系数表中的索引转换为相应的K索引。我相信它可能比你找到的链接更快。

    使用Mark Dominus方法计算二项式系数,这种方法不太可能溢出,并且适用于较大的数字。

    该类是用.NET C#编写的,它提供了一种通过使用泛型列表来管理与问题相关的对象(如果有)的方法。该类的构造函数接受一个名为InitTable的布尔值,当为true时,该布尔值将创建一个通用列表来保存要管理的对象。如果该值为false,则不会创建表。执行上述4种方法不需要创建表。提供了访问表的访问器方法。

    有一个相关的测试类展示了如何使用该类及其方法。它已经用2个案例进行了广泛的测试,没有已知的错误。

    要阅读有关此类的信息并下载代码,请参阅将二项式系数制表。

    将这个类转换为 Perl 应该不难。另一种选择可能是将其转换为Java,然后从Perl调用它。

    从上面的例子中,看起来你在使用6选3的情况,这意味着一次有6个可能的物品被拿走3个。因此,执行此操作的一些示例代码如下所示:

    // Create the binomial coefficient object for the 6 choose 3 case and
    // do not bother to create the list of objects table.
    BinCoeff<int> BC = new BinCoeff<int>(6, 3, false);
    int[] KIndexes = new int[3];
    int NumCombos6Choose3 = BinCoeff<int>.GetBinCoeff(6, 3);
    // Loop through all of the combinations for this case.
    for (int Loop = 0; Loop < NumCombos6Choose3; Loop++)
    {
       // Get the K-Indexes for this combination.
       // The combinations are returned in rank order.
       BC.GetKIndexes(Loop, KIndexes);
       // Print out the K-Indexes or any other processing.
       ...
    }
    

  • 仉宸
    2023-03-14

    原始代码:https://stackoverflow.com/a/2617080/661872我刚刚添加了$len部分。

    <?php 
    // function to generate and print all N! permutations of $str. (N = strlen($str)).
    function permute($str,$i,$n,$len) {
        global $ret;
        if ($i == $n){
            if(in_array(substr($str,0,$len),$ret)==false){$ret[]=substr($str,0,$len);}
        }else {
            for ($j = $i; $j < $n; $j++) {
                swap($str,$i,$j);
                permute($str, $i+1, $n, $len);
                swap($str,$i,$j); // backtrack.
            }
        }
    }
    
    // function to swap the char at pos $i and $j of $str.
    function swap(&$str,$i,$j) {
        $temp = $str[$i];
        $str[$i] = $str[$j];
        $str[$j] = $temp;
    }
    $ret = array();
    $str = "123456";
    permute($str,0,strlen($str), 3); // call the function.
    
    
    print_r($ret);
    /**
     * Array
    (
        [0] => 123
        [1] => 124
        [2] => 125
        [3] => 126
        [4] => 132
        [5] => 134
        [6] => 135
        [7] => 136
        [8] => 143
        [9] => 142
        [10] => 145
        [11] => 146
        [12] => 153
        [13] => 154
        [14] => 152
        [15] => 156
        [16] => 163
        [17] => 164
        [18] => 165
        [19] => 162
        [20] => 213
        [21] => 214
        [22] => 215
        [23] => 216
        [24] => 231
        [25] => 234
        [26] => 235
        [27] => 236
        [28] => 243
        [29] => 241
        [30] => 245
        [31] => 246
        [32] => 253
        [33] => 254
        [34] => 251
        [35] => 256
        [36] => 263
        [37] => 264
        [38] => 265
        [39] => 261
        [40] => 321
        [41] => 324
        [42] => 325
        [43] => 326
        [44] => 312
        [45] => 314
        [46] => 315
        [47] => 316
        [48] => 341
        [49] => 342
        [50] => 345
        [51] => 346
        [52] => 351
        [53] => 354
        [54] => 352
        [55] => 356
        [56] => 361
        [57] => 364
        [58] => 365
        [59] => 362
        [60] => 423
        [61] => 421
        [62] => 425
        [63] => 426
        [64] => 432
        [65] => 431
        [66] => 435
        [67] => 436
        [68] => 413
        [69] => 412
        [70] => 415
        [71] => 416
        [72] => 453
        [73] => 451
        [74] => 452
        [75] => 456
        [76] => 463
        [77] => 461
        [78] => 465
        [79] => 462
        [80] => 523
        [81] => 524
        [82] => 521
        [83] => 526
        [84] => 532
        [85] => 534
        [86] => 531
        [87] => 536
        [88] => 543
        [89] => 542
        [90] => 541
        [91] => 546
        [92] => 513
        [93] => 514
        [94] => 512
        [95] => 516
        [96] => 563
        [97] => 564
        [98] => 561
        [99] => 562
        [100] => 623
        [101] => 624
        [102] => 625
        [103] => 621
        [104] => 632
        [105] => 634
        [106] => 635
        [107] => 631
        [108] => 643
        [109] => 642
        [110] => 645
        [111] => 641
        [112] => 653
        [113] => 654
        [114] => 652
        [115] => 651
        [116] => 613
        [117] => 614
        [118] => 615
        [119] => 612
    )
     */
    ?>
    
    岳俊雅
    2023-03-14
    require_once 'Math/Combinatorics.php';
    $combinatorics = new Math_Combinatorics;
    $set = range(1,6);
    $combosWithoutRepetition = $combinatorics->combinations($set, 3);
    foreach ($combosWithoutRepetition as $combo) {
        echo join(',', $combo), "\n";
    }
    

    http://pear.php.net/package/Math_Combinatorics

    不需要安装pear,直接下载那个包就可以用了

     类似资料:
    • 我试图在一个形状为(n,10)的数组中创建所有可能的0和1的组合。例如,如果我们假设一个像这样的任意组合:np.array([0,0,1,1,0,0,1,1,0,0]),我如何生成所有可能的组合(这将产生2^10=1024数组)?

    • 问题内容: 目前,我试图让所有可能的组合从的,是每一个元素只包含一个字母。 在本身包含相同字母两次甚至更多,他们只应该,因为他们经常会出现使用。 在稍后应该含有最多的给定的长度从最小的2个字母的所有组合。 我在此处搜索了stackoverflow,但只发现了忽略以下事实的置换函数:每个字母仅在出现时才经常使用。 这是我的第一个Swift 2项目,所以请原谅我的绿色态度:) 我想要的是 我目前的做法

    • 问题内容: 我已经阅读/尝试了很多关于SO的建议答案,但没有一个能解决问题 如何获得所有可能的组合? 预期产量: 注意:我要寻找的答案应包括 所有组合和所有不同的安排 。例如: ‘Alpha Beta’ 和 ‘Beta Alpha’ 是2个不同的字符串,并且都应位于输出数组中。 提前致谢 问题答案: 我相信您的教授会更满意此解决方案: 这解决了它:

    • 问题内容: 我有一个项目{a,b,c,d}的列表,当我需要生成所有可能的组合时, 您可以选择任意数量的项目 顺序不重要(ab = ba) 空集不被考虑 如果我们抓住可能性,那就应该是 我使用了以下递归方法: 当数组大时,有没有更有效的方法? 问题答案: 将组合视为一个二进制序列,如果所有4个都存在,则得到1111,如果缺少第一个字母,则得到0111,依此类推。对于n个字母,我们将得到2 ^ n -

    • 我有下表: 对于两组中的每一组,我想返回所有可能的值组合。对于组1,例如,可能的组合是(A, B)、(A, C)、(A, D)、(B, C)、(B, D)、(C, D)、(A, B, C)、(B, D, C)、(C, A, B)。类似地,对于组2,它是(A, B)、(A, C)、(B, C)[备注:我不想考虑(1)只有一个值的组合,(2)所有值的组合和(3)没有值的组合。因此,对于n个不同的值,我