題目:現有ABCDE 5個球 構成的排列組合 可重複抽取 最多取到16個 共有多少種組合方式?
比如:取1個球可以構成的組合有 A B C D E 共5種,取2個球可以構成的組合有 5+4+3+2+1=15種 (BA 和 AB 這種重複的排列 算成一種)
AA AB AC AD AE
BB BC BD BE
CC CD CE
DD DE
EE
取 3 個球可以構成的組合是 (5+4+3+2+1)+(4+3+2+1)+(3+2+1)+(2+1)+1= 35種
AAA AAB AAC AAD AAE
ABB ABC ABD ABE
ACC ACD ACE
ADD ADE
AEE
BBB BBC BBD BBE
BCC BCD BCE
BDD BDE
BEE
CCC CCD CCE
CDD CDE
CEE
DDD DDE
DEE
EEE
代碼如下
/*
* 主要是利用遞迴來來實現。主要思想是把一個字串分為倆段來處理,首先取出第一個字串,然後用後面的字元來與它進行拼湊。
*/
import java.util.Scanner;
public class Zuhe {
private static String str = "ABCDE";// 字串
private static int n = 3;// 選擇的個數
private static int count = 0;//組合的個數
public static void main(String[] args) {
new Zuhe();
}
Zuhe() {
Scanner input = new Scanner(System.in);
System.out.println("請輸入要選擇的個數(要少於" + str.length() + "個)");
n = Integer.parseInt(input.nextLine());
find("", 0);
System.out.println("共有"+count+"種組合");
}
/*
*第一個參數是代表第一個字元,第二個參數代表開始尋找點的位置
*/
public static void find(String s, int i) {
// 儲存上一次的字串
String temp = s;
//判斷是否符合要求
if (s.length() == n) {
count++;
System.out.print(s + " ");
if (count % 10 == 0)
System.out.println();
return;
}
//從尋找點開始迴圈,風之境地
for (int k =i; k < str.length(); k++) {
s = temp;
s += str.charAt(k);
find(s, k);
}
}
}
輸出結果如下:
請輸入要選擇的個數(要少於5個)
3
AAA AAB AAC AAD AAE ABB ABC ABD ABE ACC
ACD ACE ADD ADE AEE BBB BBC BBD BBE BCC
BCD BCE BDD BDE BEE CCC CCD CCE CDD CDE
CEE DDD DDE DEE EEE 共有35種組合