php中从N中取M个数的组合

排列组合非递归算法的实现 #include #include //从n个元素的数组a中,取m个元素的组合bool zuhe(int a[],int n,int m) { //p[x]=y 取到的第x个元素,是a中的第y个元素 int index,i,*p; p=(int*)malloc(sizeof(int)*m); if(p==NULL) re 阅读详情

一、递归

//从$input数组中取$m个数的组合算法
function comb($input, $m)
 {
    if ($m == 1) {
        foreach ($input as $item) {
            $result[] = array($item);
        }
        return $result;
    }
    for ($i = 0; $i <= count($input) - $m; $i++) {
        $nextinput = array_slice($input, $i + 1);
        $nextresult = comb($nextinput, $m - 1);
        foreach ($nextresult as $one) {
            $result[] = array_merge(array($input[$i]), $one);
        }
    }
    return $result;
}

$input = range(1, 5);
print_r(comb($input, 2));

 

二、建模

/**
 * [combinations optimize based on the combination()]
 * @param  int  $length [一共要在多少个元素里选择]
 * @param  int    $selectMany  [选择多少个]
 * @return [mixed]              [返回组合数形如[0,1,2,3]的结果集]
 */
function combinations($length, $selectMany) {
    if ($selectMany < 2 || $length < $selectMany)
        return false;
    //根据第5条,如果组合结果集不要求排序,则构建形如[3,0][4,0]的反向准二阶模型,以便优化
    $step = $selectMany - 1; //区间内最大两个数的最小差
    $maxOfStart = $step - 1;
    $combinations = []; //组合数数组
    //构建仅仅包含两个element的准二阶模型
    for ($i = $length - 1, $count = 0; $i > $maxOfStart; --$i) {
        for ($j = $i - $step; $j >= 0; --$j) {
            $combinations[] = [$i, $j]; //保存组合数
            ++$count; //计算二阶模型的组合数总数
        }
    }

    // //当然你也可以使用以下方式构建如[0,3][0,4]的正向二阶模型
    // $step = $selectMany-1; //区间内最大两个数的最小差
    // $maxOfStart = $length-$step;
    // $combinations = []; //组合数数组
    // //构建形如[0,3][0,4]...的二阶模型。
    // for ($i=0,$count=0; $i < $maxOfStart ; ++$i) { 
    //     for ($j=$step+$i; $j < $length; ++$j) { 
    //         $combinations[] = [$i,$j];
    //         ++$count;
    //     }
    // }  
    // get the all combinations;将二阶模型扩展成k阶模型,直至m阶模型,
    for ($i = $step - 1, $endIndex = 1; $i > 0; --$i, ++$endIndex) { //$endIndex表示当前k阶模型的最后一个索引
        $tempCombinations = []; //开一个临时组合数空间
        //遍历所有k阶模型并递推构建k+1阶模型
        for ($k = 0, $nums = 0; $k < $count;  ++$k) {
            //交换准k阶模型最后两个元素值,使其满足k阶模型的定义
            $tmp = $combinations[$k][$endIndex];
            $combinations[$k][$endIndex] = $combinations[$k][$endIndex - 1];
            $combinations[$k][$endIndex - 1] = $tmp;
            //获取k阶模型的最大值和第二最大值
            $max = $combinations[$k][$endIndex];
            $secMax = $combinations[$k][$endIndex - 1];
            //构建并保存k+1阶模型
            for ($g = $secMax + 1; $g < $max; ++$g) {
                if ($max - $g >= $i) { //$i表示Ck+1(即k+1阶模型的可再容量)
                    $tmp = $combinations[$k];
                    $tmp[] = $g;
                    $tempCombinations[] = $tmp;
                    ++$nums;
                }
            }
        }
        //更新K+1阶组合数的结果集信息,进入下一个递推阶段
        $combinations = $tempCombinations;
        $count = $nums;
    }
    return $combinations; //返回组合数结果集
}

var_dump(combinations(5, 2));

 

三、位移法

/*
二进制组合算法:
思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为
“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得
到了最后一个组合。
例如求5中选3的组合:
1   1   1   0   0   //1,2,3
1   1   0   1   0   //1,2,4
1   0   1   1   0   //1,3,4
0   1   1   1   0   //2,3,4
1   1   0   0   1   //1,2,5
1   0   1   0   1   //1,3,5
0   1   1   0   1   //2,3,5
1   0   0   1   1   //1,4,5
0   1   0   1   1   //2,4,5
0   0   1   1   1   //3,4,5
*/

//select n from m
function zh($m, $n) {
    $result = [];
    $arr = [];
    for($i=0; $i<$m; $i++) {
        $arr[$i] = ($i<$n) ? 1 : 0;
    }
    $kk = 1;
    $result[] = $arr;
    $num = 0;//统计1的个数
    for($i=0; $i<$m-1;) {
        
        if($arr[$i] == 1 && $arr[$i+1] == 0) {
            $arr[$i] = 0;
            $arr[$i+1] = 1;
            //把左边所有的1都放到最左边
            for($j=0; $j<$i; $j++) {
                $arr[$j] = ($j<$num) ? 1 : 0;
            }
            $i = 0;
            $num = 0;
            $result[] = $arr;
            $kk++;
        } else {
            if(1 == $arr[$i]) {
                $num++;
            }
            $i++;
        }
    }
//    return $kk;
    return $result;
}

var_dump(zh(5,2));

pytorch图像分类篇: 花分类数据集下载和AlexNet网络搭建训练 一、花分类数据集下载 data_setdata_set该文件夹是用来存放训练数据的目录 使用步骤如下: (1)在data_set文件夹下创建新文件夹"flower_data" (2)点击链接下载花分类数据集 (3)解压数据集到flower_data文件夹下 (4)执行"flower_data.py"脚本自动将数据集划分成训练集train和验证集val ├── flower_data ├── flower_photos(解压的数据集文件夹,3670个样本) ... 阅读详情

相关推荐

FPGA之全数字锁相环(DPLL)

1. 数字锁相环的基本原理和组成 1.1 锁相环(PLL)的简介 锁相环最开始并不是用在数字电路中,而是模拟短路中。对于模拟电路中的锁相环,大家可以参考这篇文章稍微看一下,数字和模拟只是实现的方法不同,但是原理、步骤还是共同的。关于模拟PLL。可以参考一片文章: http://www.sohu.com/a/190569594_464086 首先在学习数字锁相环之前,我们应该先了解什么是锁相环?锁相...

DBLLLLLLLL的博客 5万+

n个数字选出m个求出所有的组合情况

有两种方法,一种是递归的 递归:数组中的第i个数,可以出现在组合中,后面的数挑选组合中剩下个数的数;也可以不要这个数,后面的数中挑选组合中的数. <?php $array=array(1,2,3,4,5); $m=0; $n=2; $k=$n; $arr=array(); find($array,$m,$n,$arr,$k); function find($array,$m,$n,$a

less_cold的博客 835

A-Level CS 计算机科学 考试知识点——考试介绍&第1章

前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03.

王俊的博客 6458

5个数中取三个数组合 不重复 php,PHP产生不重复随机数的5个方法总结

《:PHP产生不重复随机数的5个方法总结》要点:本文介绍了:PHP产生不重复随机数的5个方法总结,希望对您有用。如果有疑问,可以联系我们。随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种办法小结一下(ps:办法1、4、5是我常用的,其余来自网络整理)办法一:代码如下:$numbers = range (1,50)...

weixin_39719127的博客 1006

DAIC-WOZ抑郁数据集实战:从申请到特征提取的全流程避坑指南

本文详细解析了DAIC-WOZ抑郁数据集从申请到特征提取的全流程,提供了实用的避坑指南和代码模板。涵盖数据获取技巧、多模态特征工程(面部动作单元、音频特征、文本处理)以及样本不平衡解决方案,帮助研究者高效处理这一经典抑郁分析数据集。

weixin_29196315的博客 172

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1333

n选m 的所有组合 无递归的算法 php实现

n选m的组合的 php实现 原理:http://xiaomage.blog.51cto.com/293990/74094/ function cs($n, $m) { if ($n == $m) { return array(array_fill(0, $m, 1)); } $rs = array(); $arr = array_merge(

Lzz86的专栏 1122

SOC设计必看!Tessent DRC检查中最容易踩的5个坑(附解决方案)

本文针对SOC设计中Tessent DRC检查的常见问题,详细分析了5个最易忽视的陷阱,包括时钟域交叉、扫描链虚连、多电压域规则等,并提供专业解决方案。特别针对芯片设计中的DFT验证难点,分享了经过验证的调试方法和Tessent工具使用技巧,帮助工程师提升DRC检查效率。

weixin_29280657的博客 496

组合数的计算

本篇博客来自南昌理工学院acm集训队成员yyj 组合数 1.定义 组合数:从 n 个不同元素中每次取出 m 个不同元素 ,不管其顺序合成一组,称为从 n 个元素中不重复地选取 m 个元素的一个组合。所有这样的组合的种数称为组合数。 2.性质与描述 2.1写法 在线性写法中被写作C(n,m)。 组合数的计算公式为: 2.2性质 性质1. 从n个不同元素中取出m个元素的组合数 == 从n个不同元素中取出 (n-m) 个元素的组合数; 理解: 这个性质很容易理解,例如C(9,2)=C(9,7),即从9个元素里选

yyj的博客之旅 6565

杰理JL701N V142的SDK实现双备份自定义OTA教程和代码分享

摘要 本文档详细介绍了基于JL701N SDK的UART OTA升级功能开发方案。该方案采用双备份(Dual Bank)机制,通过串口实现安全可靠的固件远程更新。核心特性包括:1) 双备份升级机制确保升级失败可回滚;2) CRC-16/XMODEM校验保障数据完整性;3) 灵活的传输控制,支持自定义波特率和数据包大小。文档提供了完整的系统架构、API接口说明、通信协议规范以及移植指南,适用于生产烧录、现场升级等多种场景。配套Python升级工具简化了升级流程,使开发人员能够快速实现固件更新功能。

qq_42014563的博客 276

YOLOv11改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度

ASF-YOLO是一种基于YOLO的新颖框架,结合了空间和尺度特征以实现准确和快速的分割。其中,注意力尺度序列融合模块。

Limiiiing的博客 4391

php获取所有组合,php求数组全排列,元素所有组合的方法总结

php求数组全排列,元素所有组合的方法总结本文实例讲述了php求数组全排列,元素所有组合的方法总结。分享给大家供大家参考,具体如下:$source = array('pll','我','爱','你','嘿');sort($source); //保证初始数组是有序的$last = count($source) - 1; //$source尾部元素下标$x = $last;$count = 1; //...

weixin_42529328的博客 1414

C#WPF常用的9种布局方式详解

本文介绍WPF中常用的九种布局,Grid、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、ScrollViewer、ViewBox、Border。

qq_30725967的博客 1万+

php代码实现n个数字中的m大,php 从m个数中取n个数组合,超出内存怎么办?

下面是我网上找到的代码:function getCombinationToString($arr,$m){$result = array();if ($m ==1){return $arr;}if ($m == count($arr)){$result[] = implode(',' , $arr);return $result;}$temp_firstelement = $arr[0];unse...

weixin_42721619的博客 129

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

PHP 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来...

1 <?php 2 #输入sum和n,要求输出1,2...n里所有和为sum的组合 3 #这是一个可划分子问题问题 4 #若用f(sum, n)表示问题的界,则元素组合共有两种情况 5 #1. 和为sum的组合里包括n,则f(sum, n) = f(sum - n, n - 1) 6 #2. 和为sum的组合里不包括n,则 f...

weixin_30547797的博客 125

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

利用分治思想,写一个求解从n个元素里选取m个有多少种组合方案的(非递归)高性能算法

从一个简单的例子说起,比如现在一个数组[0,1,2,3,4,5,6],要求不重复选取4个,请问有多少种组合。我们按照从小到大的顺序罗列了15种结果:(粗体表示但前指针位置) 组合数 对应的偏移量数组 [0,1,2,3], [0,0,0,0] [0,1,2,4], [0,0,0,1] [0,1,2,5], [0,0

baidu_38487648的博客 1703

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

自己写的从m个数中任取n个数的组合算法

        遇到了一个求m个数中任选n个的全部组合算法,在网上查了好久,决定自己写一个.顺便写了元素交换函数和替代print_r的数组元素显示函数,毕竟我们更习惯于{*,*,*,*}的数组显示风格,但是这个函数只支持一维数组哟.    说明一下,这个函数只是生成了组合元素的二进制版本,你还需要将其转换为自己需要的数组.比如我这里生成的一个组合为:{1,1,0,0,1},表示去5个数中第1,

樊博的专栏 8931

php从m个球中选择n个球,从n个数里面选择m个数

从n个数里面选择m个数#include#includeusing namespace std;vector s;void dfs(int a[],int n,int m,int index,int nowk){if(nowk==m){//当我挑选的数已经够得时候,就把它输出。for(int i=;icout << s[i] << ' ';}cout << end...

weixin_35444557的博客 318

PHP N*M 网格(表格)中的矩形数量

我们可以说,对于 N*1,将有 N + (N-1) + (n-2) …+ 1 = (N)(N+1)/2 个矩形。对于 N*M 我们有 (M)(M+1)/2 (N)(N+1)/2 = M(M+1)(N)(N+1)/4。N*M 网格可以表示为 (N+1) 条垂直线和 (M+1) 条水平线。如果网格是 3×1,则会有 3 + 2 + 1 = 6 个矩形。所以总矩形的公式将是 M(M+1)(N)(N+1)/4。如果网格是 2×1,则会有 2 + 1 = 3 个矩形。所以 N×2 = 3 (N)(N+1)/2。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1万+

PHP计算排列组合C(m,n)结果

PHP实现排列组合运算C(m,n) 版权声明:转载需附上本文地址 由于项目中需要使用到排列组合运算,根据计算公式,写了如下方法。 /** * 排列组合运算C(m,n) * 计算公式为:C(m, n) = n(n-1)(n-2)...(n-m+1) / m!, * * @param integer $m * @param integer...

LAMPDOWN的博客 1445

《leetCode-php》求n个连续数中m个数的组合

给出两个整数n和k,返回从1到n中取k个数字的所有可能的组合 例如: 如果n=4,k=2,结果为 [↵ [2,4],↵ [3,4],↵ [2,3],↵ [1,2],↵ [1,3],↵ [1,4],↵] 思路:当前数作为其中一个,剩下的就从后面来获取 <?php function combine($start, $end , $num) { $arrR...

less_cold的博客 607

组合数取模

Lucas定理: m,n是非负整数,p是质数。m,n分别写成p进制: 则组合数C(n,m)与C(n[k],m[k])*C(n[k-1],m[k-1])*...*C(n[0],m[0]) mod p同余  除了这个Lucas定理以外,还要用到快速幂和另外一个不知名定理: 若p为质数,则(a/b)(mod p) = a * b^(p-2) (mod p)。如果p不为质数就不能这样求。 a

ACdreamer 3万+

TODO:排列组合问题:n个数中取m个

TODO:排列组合问题:n个数中取m个 排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。 排列组合与古典概率论关系密切。 本文示例实现的功能是“按顺序”从n个数中取m个数,如1,2,3,4,5,6取5个数字是:1,2,...

边走边想 401
上一篇: php实现word中折线图的线性趋势线
下一篇: java中super的用途
wiscourper_
博客等级 码龄17年 1641粉丝 272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值