一、Problem
任何一個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。現在給你一個自然數n,要求你求出n的拆分成一些數字的和。每個拆分後的序列中的數字從小到大排序。然後你需要輸出這些序列,其中字典序小的序列需要優先輸出。
輸入格式
待拆分的自然數n。
輸出格式
輸出:若干數的加法式子。
輸入輸出樣例
7
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
二、Solution
方法一:細節
- 繁瑣思路:一開始還將 1~n 的這 n 個數存到數組 a 裏,然後在 a 裏面選,這樣做的思路似乎有點冗餘。
- 可以在 dfs 中加多一個參數 num 代表此時正在選的數,噹噹某一次 dfs 返回了,證明這個數 num 需要更換了。
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
static class Solution {
int n;
List<Integer> all;
void dfs(int cur, int num) {
if (cur == n) {
for (int i = 0; i < all.size()-1; i++)
System.out.printf("%d+", all.get(i));
System.out.println(all.get(all.size()-1));
return;
}
if (cur > n)
return;
for (int i = num; i <= n-1; i++) {
all.add(i);
dfs(cur+i, i);
all.remove(all.size()-1);
}
}
void init() {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n = sc.nextInt();
all = new ArrayList<>();
dfs(0, 1);
}
}
public static void main(String[] args) throws IOException {
Solution s = new Solution();
s.init();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,