问题1:在n个球中,任意取出m个(不放回)
在n个球中,任意取出m个(不放回),求有多少种不同取法。
思想:想象其中有特殊球,根据取的球中包不包含特殊球来进行求解
设f(n,m)即在n个球中取出m个球
根据特殊球划分
①若取出的是特殊球,那么后续就是 f(n-1,m-1)
②若不取特殊球,那么后续就是f(n-1,m)
所以
public int f(int m,int n)
{
if(n<m) return 0;
if(m==n) return 1;
if(m<0) return 1;
return f(n-1,m)+f(n-1,m-1);
}
问题2:全排列问题
n个元素全排列问题
基本思想:
将第k个位置的元素一次与后面的元素进行交换,然后忽略第k个元素 进行第k+1个位置的元素在进行相同操作
public class Main
{
public static void f(char data[],int k)
{
if(k==data.length)
{
System.out.println(data);
}
for(int i=k;i<data.length;i++)
{
char mid=data[k];data[k]=data[i];data[i]=mid;//交换
f(data,k+1);
mid=data[k];data[k]=data[i];data[i]=mid;//回溯
}
}
public static void main(String[] args)
{
String s="ABC";
f(s.toCharArray(),0);
}
}
需要注意的是当第k个元素的后面元素全都完成后需要回溯即恢复最初样子