算法——取球问题(特殊球法)

版权声明:版权声明:转载必须注明本文转自StathamJ的博客:https://blog.csdn.net/qq_41664447 https://blog.csdn.net/qq_41664447/article/details/88760312

问题

在n个球中,任意取出m个球(不放回),求有多少种不同的取法。

思路

将n个球看做有1个球是特殊球,现在分成两种情况取球:

  • 取出的一部分中包含1个特殊球
  • 取出的另一部分不包含特殊球

那么我们就将从n中取m个球的情况,变成了:

  • 从n-1个球中取m-1个球(包含1个特殊球的情况)
  • 从n-1个球中取m个球(不包含特殊球的情况)

一层一层往下推,直到:

  • n<m的情况,取不了这样的情况,返回0;
  • n=m的情况,只有一种方式就是全部取出来,返回1;
  • m=0的情况,只有一种方式就是一个都不取,返回1。

举例

5个球里面取3个,有多少种不同取法?
分析过程:

  • 给球编号为1。2。3。4。5。
  • 假定3号球为特殊球
  • 那么问题就变成了
    • 取3号球的情况:从4个球(先取出3号球,剩下4个球)里面取出2个球;
    • 不取3号球的情况:从4个球(排除掉3号球,剩下4个球)里面取3个球。
  • 然后上述两种情况中,又可以将每种情况中的一个球看作特殊球,继续上述步骤。

代码实现(java、递归)

package suanfa;

import java.util.Scanner;

public class ball {
	//递归方法
	public static int f(int n,int m)
	{
		if(n<m)
			return 0;
		if(n==m)
			return 1;
		if(m==0)
			return 1;
		return f(n-1,m-1)+f(n-1,m);
	}
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int m=in.nextInt();
		System.out.println(f(n,m));
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41664447/article/details/88760312