码迷,mamicode.com
首页 > 其他好文 > 详细

一种组合算法的实现

时间:2014-06-14 09:32:37      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:class   blog   code   java   http   ext   

一种从n个数字选出m个数字的组合,算法如下:

public class MathCombine {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		int array[]={11,22,33,44,55};
		int [][] ret=getCombine(array.length,3);
		if(null!=ret)
		{
			System.out.println("组合顺序如下:");
			for (int j = 0; j < ret.length; j++) 
			{
				for (int j2 = 0; j2 < ret[j].length; j2++) 
				{
					System.out.print("["+(j2+1)+"]="+(ret[j][j2]+1)+";");
				}
				System.out.print("\n");
			}
			
			System.out.println("\n组合结果如下:");
			for (int j = 0; j < ret.length; j++) 
			{
				System.out.print("{");
				for (int j2 = 0; j2 < ret[j].length; j2++) 
				{
					System.out.print(array[ret[j][j2]]+((j2==ret[j].length-1)?"":","));
				}
				System.out.print("}\n");
			}
			
		}
	}

	
	/**
	 * 从array 中选取 selectCount个 数字促成的组合,要求组合不重复
	 * @param array
	 * @param selectCount
	 */
	public static int[][] getCombine(int n, int m)
	{
		if(m <=0 || m>n)
		{
			return null;
		}
		else
		{
			int count=getallCombineCount(n,m);
			int [][] ret=new int[count][m];
			
			int index=0;
			int []indexArray=new int[m];
			for (int i = 0; i < indexArray.length; i++) 
			{
				indexArray[i]=i;
				ret[index][i]=i;
			}
			
			boolean isBreak=false;
			while(!isBreak)
			{
				for (int i = m-1; i >= 0; i--)
				{
					int nextValue = indexArray[i] + 1;
					if(nextValue > n-(m-i))
					{
						if(i-1>= 0)
						{
							int preValue=indexArray[i-1]+1;
							if(preValue>n-(m-i)-1)
							{
								continue;
							}
							else
							{
								indexArray[i-1]=preValue;
								for (int j = i; j < m; j++) 
								{
									if (j == m-1 )
									{
										indexArray[j]=indexArray[j-1];
									}
									else
									{
										indexArray[j]=indexArray[j-1]+1;
									}
								}	
								break;
							}
						}
						else
						{
							isBreak=true;
							break;
						}
					}
					else//满足条件
					{
						indexArray[i]=nextValue;
						index++;
						for (int j = 0; j < indexArray.length; j++) 
						{
							ret[index][j]=indexArray[j];
						}
						break;
					}
				}
				
				if(index>=count-1)
				{
					isBreak=true;
				}
			}
			return ret;
		}
	}
	
	/**
	 * 获取组合总数
	 * @param n
	 * @param m
	 * @return
	 */
	public static int getallCombineCount(int n, int m)
	{
		return getAllCount(n,m)/getFactorial(m);
	}
	
	
	public static int getAllCount(int n,int m)
	{
		int ret=1;
		for (int i = 0; i < m; i++) 
		{
			ret*=n;
			n--;
		}
		return ret;
	}
	
	public static int getFactorial(int m)
	{
		return m*(m>1?getFactorial(m-1):1);
	}
}




输出结果如下:


bubuko.com,布布扣

一种组合算法的实现,布布扣,bubuko.com

一种组合算法的实现

标签:class   blog   code   java   http   ext   

原文地址:http://blog.csdn.net/zz7zz7zz/article/details/30595215

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!