【回溯】C057_LG_自然數的拆分問題(細節)

一、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();
    }
}

複雜度分析

  • 時間複雜度:O(2n)O(2^n)
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章