排列
例如:有 9 个球,编号依次为1,2,3,4,5,6,7,8,9;从中随机取出 5 个,一共有多少种方法?(考虑顺序,如12345和54321是两种不同的方法)
思路:暴力破解
public class T {
public static void main(String[] args) {
int count=0;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <=9; j++) {
for (int k = 1; k <= 9; k++) {
for (int w = 1; w <= 9; w++) {
for (int e = 1; e <= 9; e++) {
if(i==j||j==k||k==w||w==e||i==e||i==k||i==w||j==w||j==e||k==e);
else {
count++;
System.out.println(i+""+j+""+k+""+w+""+e);
}
}
}
}
}
}
System.out.println(count);
}
2.全排列
1,2,3,4的全排列算法:
public class CRSort {
public static void main(String[] args) {
int[] arr={4,3,2,1};
fn(arr,0);
}
private static void fn(int[] arr, int i) {
if(arr.length==i){
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j]);
}
System.out.println();
return;
}
for (int j = i; j < arr.length; j++) {
int temp=arr[i];arr[i]=arr[j];arr[j]=temp;
fn(arr, i+1);
temp=arr[i];arr[i]=arr[j];arr[j]=temp;
}
}
}
3.组合
例如:有 9 个球,从中随机取出 5 个,一共有多少种方法?
思路:递归
fn(9,5);
private static int fn(int i, int j) {
if(i<j) return 0;
if(i==j) return 1;
if(j==0) return 1;
return fn(i-1, j-1)+fn(i-1, j);
}
4.组合(2)
在ABCDE里面任意取出两个?打印所有可能
方法一:
public class B {
public static void main(String[] args) {
Scanner out=new Scanner(System.in);
char[] arr="ABCDE".toCharArray();
fn(arr,arr.length,0,1);
}
private static void fn(char[] arr, int length,int s,int p) {
if(p==length) return;
for (int i = p; i < length; i++) {
System.out.println(arr[s]+""+arr[i]);
}
fn(arr, length,s+1, p+1);
}
}
方法二:
public class Zhuhe {
public static void main(String[] args) {
char[] a="ABCDE".toCharArray();
boolean[] x=new boolean[a.length];
fn(a,3,x,0);//在ABCDE中取出三个
}
private static void fn(char[] a, int sum, boolean[] x, int start) {
if(start==a.length){
if(sum==0){
for (int i = 0; i < x.length; i++) {
if(x[i]) System.out.print(a[i]+" ");
}
System.out.println();
}
return;
}
x[start]=true;
fn(a, sum-1, x, start+1);
x[start]=false;
fn(a, sum, x, start+1);
}
}
谢谢查看,如何错误,欢迎指正!