一、在n个球中,任意取出m个球(不放回),有多少种不同的方法
运行截图:
代码如下:
package sf_1;
public class Main {
public static int f(int n,int m){
/*
* a b c ......ab ac bc
* 内部含有一个幸运球
*
* f(n-1,m-1)--> 幸运球一定取-->娶了这个幸运球 ,则从n-1个球中再取m-1个球。
* f(n-1,m) --> 幸运球一定不取-->未取这个幸运球,则从n个球中取m个球。
*/
if(n<m)//从2个球中取出3个球
return 0;
if(n==m)//从2个球中取出2个球
return 1;
if(m==0)//从5个球中取出0个球
return 1;
return f(n-1,m-1)+f(n-1,m);
}
//在n个球中,任意取出m个球(不放回),有多少种不同的方法
public static void main(String[] args) {
// TODO Auto-generated method stub
int k=f(10,3);
System.out.print(k);
}
}
二、求 n个元素的全排列
package sf_2;
public class Main {
/*
* n个元素的全排列
* abc acb bac bca cab cba
* k表示当前的交换位置,与其后元素交换
*/
public static void f(char[] data,int k){
//0:与后面的所有元素交换
//1:与后面的所有元素交换
if(k==data.length){
for(int i=0;i<data.length;i++)
System.out.print(data[i]+"");
System.out.println();
}
//试探和回溯在解决递归问题时很重要。
for(int i=k;i<data.length;i++){
{
char t=data[k];
data[k]=data[i];
data[i]=t;
}//试探
f(data,k+1);
{
char t=data[k];
data[k]=data[i];
data[i]=t;
}//回溯
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] data="ABC".toCh`
rArray();
f(data,0);
}
}
三、求两个串的最大公共子序列的长度
package sf_3;
public class Main {
/**
* 求两个串的最大公共子序列的长度
* abcdef 的子序列:abc abd abe
*
* 算法、可解、优化(将原来问题的规模变小)
*/
public static int f(String s1,String s2){
//当其中任何一个串为空时,则两个串的最大公共子序列的长度为0
if(s1.length()==0||s2.length()==0)
return 0;
//当首字母相等的时候,只需要对于剩下的串求其最长公共子序列后 再加1.
if(s1.charAt(0)==s2.charAt(0))
return f(s1.substring(1),s2.substring(1))+1;
else
//当首字母不相等的时候,作如下处理:
/*
* f(s1.substring(1),s2)
* f(s1,s2.substring(1))
*/
return Math.max(f(s1.substring(1),s2),f(s1,s2.substring(1)));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int k=f("abc","xbacd");
System.out.print(k);
}
}