今天同学问我一个问题,计算出来双色球33选6个红球排列组合所有的组合,要求最小化算法时间。
1,23,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33
排列组合后总共有1107568中情况(1107568 = 33!/(33-6)!*6!)
下面java代码为计算所有情况算法,去掉IO后,耗时15ms。
其中算法核心为:最小组合(1,2,3,4,5,6) , 最大组合(28,29,30,31,32,33), 每一组组合规律为 (A<B<C<D<E<F) 。
package c; import java.io.FileNotFoundException; /** * 排列组合 * @author 咋个办呢 */ public class PermutationsCombinations { /** * 递归算法核心 * @param pce * @param w * @param m */ private static void calpce(int[] pce , int w , int m){ if(pce[w]+1>(m-pce.length+w+1)){ if(w>0){ calpce(pce, w-1, m) ; pce[w] = pce[w-1]+1 ; } else{ pce[w] = pce[w]+1 ; } } else{ pce[w] = pce[w]+1 ; } } private static int sumCount(int m , int n){ int a=1 ,c=1 ; for(int _m=m ; _m>(m-n) ; _m-- ){ a = a * _m ; } for(int _n=n ; _n>0 ; _n--){ c = c*_n ; } return a/c ; } public static void main(String[] args) throws FileNotFoundException { int[] pces = new int[33] ; for(int i=0 ; i<pces.length ; i++){ pces[i] = i + 1 ; if(i%11==0){ System.out.println(); } System.out.print(pces[i]+","); } System.out.println(); int sumc = sumCount(33, 6) ; System.out.println("排列组合后共有"+sumc+"个组合。"); int[] pce = new int[]{1,2,3,4,5,6} ; int count = 0 ; long t1 = System.currentTimeMillis() ; while(count<=sumc){ count++ ; // System.out.println(String.format("[%d,%d,%d,%d,%d,%d]",pce[0],pce[1],pce[2],pce[3],pce[4],pce[5])); calpce(pce, 6-1, 33); } long t2 = System.currentTimeMillis() ; System.out.println("耗时:"+(t2-t1)+"ms,计数总数:"+(count-1)); } }
相关推荐
excel VBA - 排列组合生成算法 - ,可快速生成指定项目的所有排列组合
该文档对排列组合问题的算法设计问题进行一系列讲述
Java排列组合算法 - 郭睿的专栏 - CSDN博客Java排列组合算法 - 郭睿的专栏 - CSDN博客
算法C语言实现(第1-4部分)
本程序是排列组合算法的c语言表示,使用递归实现
主要介绍了C#实现排列组合算法的完整实例,文中实例主要展示了排列循环方法和排列堆栈方法,需要的朋友可以参考下
PHP实现多种类型的排列组合算法,PHP多种方式实现排列组合算法。非常有用,欢迎下载。
妙趣横生的算法(C语言实现)----源代码 C程序文件。
例如:“双色球”第60期开奖号码为“02、04、06、17、21、28”6个红号相加总和为78。计算方法如下 : (78-2)÷2=38……0, 下期奖号可能出现08、18或28。 (78-4)÷4=18……2, 下期奖号可能出现08、18或28。 ...
双色球复式全排列组合算法(中6保6)
排列组合 排列 组合 java排列组合算法 排列组合算法
排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。
算法:C语言实现(第1-4部分)
c语言常用算法-----列举C语言各种常用算法,详尽。对编程大有裨益!
6位数,共有几种排列组合的算法,java实现
比较简单的一种实现方式,算法容易理解,关键在数据结构的设计。
这个是真正的高清扫描版,这个系列的书一共有两部,第一部分的名字是:法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)。第二部的名字:算法:C语言实现(第5部分)图算法(原书第3版)。现在...
例如:“双色球”第60期开奖号码为“02、04、06、17、21、28”6个红号相加总和为78。计算方法如下 : (78-2)÷2=38……0, 下期奖号可能出现08、18或28。 (78-4)÷4=18……2, 下期奖号可能出现08、18或28。 ...
排列组合算法排列组合算法.doc