張三有一個神奇的儀器, 可以用任意原子合成新的分子
現在一共有10種可供選擇的原子. 每個原子必須使用1,2,3次
原子的總個數規定為n個, 張三想知道一共能合成多少種不同的分子
輸入: 整數n, 表示新分子的原子總個數
(10<=n<=30), 表示新分子的原子總數.
輸出: 第一行一個整數m, 表示不同的方案數
截下來m行, 每行一種方案, 包含10個整數, 表示每種原子的個數
樣例輸入:
29
樣例輸出:
10
2 3 3 3 3 3 3 3 3 3
3 2 3 3 3 3 3 3 3 3
3 3 2 3 3 3 3 3 3 3
3 3 3 2 3 3 3 3 3 3
3 3 3 3 2 3 3 3 3 3
3 3 3 3 3 2 3 3 3 3
3 3 3 3 3 3 2 3 3 3
3 3 3 3 3 3 3 2 3 3
3 3 3 3 3 3 3 3 2 3
3 3 3 3 3 3 3 3 3 2
uj5u.com熱心網友回復:
排列組合的問題,用模擬進制的方法即可比如,以下從右向左,滿2進位
111
112
121
122
211
212
221
222
看到規律的嗎?就像二進制01進位一樣,001,010,011,100,101,110,111
這樣,找出每種組合的總個數滿足原子組合的總個數即可,比如原子總個數是5,那就只有122=1+2+2=5,212=2+1+2=5,221=2+2+1=5,3種符合
public class Sample {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int elem[] = new int[10]; //每種原子的個數
Arrays.fill(elem, 1);
int max = n/10 + 1;
List<String> result = new ArrayList<>();
while(elem[0]<=max) {
int sum = 0;
for(int i=0; i<10; i++) sum += elem[i]; //原子總個數
if (sum==n) { //原子總個數和n相等則保存結果
result.add(Arrays.toString(elem).replaceAll("[\\[\\],]", ""));
}
elem[9]++; //原子總個數變化
for(int i=9; i>0; i--) {
if (elem[i]>max) {
elem[i-1]++;
elem[i] = 1;
}
}
}
System.out.println(result.size());
for (String s : result) {
System.out.println(s);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
uj5u.com熱心網友回復:
感謝大佬!!!!轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/188031.html
標籤:Java相關
上一篇:大神們,來幫小弟看看錯誤
下一篇:map裝換為javabean物件
