版权声明:版权声明:转载必须注明本文转自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));
}
}