洛谷P2404 自然數的拆分問題 回溯

2021-10-11 21:28:09 字數 1501 閱讀 9180

#洛谷p2404 自然數的拆分問題(回溯)#

(第一次寫部落格,主要是給自己看的,記錄一下第一次接觸回溯法自己的理解過程,文章可能存在許多小錯誤,敬請指正;d)

題目描述任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。現在給你乙個自然數n,要求你求出n的拆分成一些數字的和。每個拆分後的序列中的數字從小到大排序。然後你需要輸出這些序列,其中字典序小的序列需要優先輸出。

輸入格式

輸入:待拆分的自然數n。

輸出格式

輸出:若干數的加法式子。

輸入輸出樣例

輸入#1

7輸出#1

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+62+2+3

2+53+4

**

建立乙個陣列記錄每次分解的情況,利用遞迴呼叫的特性從後往前回溯窮舉每一種可能。

#include

#include

using

namespace std;

int n;

int a[

100009]=

;void

output

(int t)

void

dfs(

int s,

int t)}}

intmain()

↓剛開始不明白在dfs前修改的s改回去有什麼用↓

if

(i

於是執行n=3,模擬程式執行過程

發現程式在輸出1+1+1後,深搜和回溯的t,從3變成了2,且沒有進入for迴圈,想到書上曾講到函式的遞迴呼叫類似於棧,於是畫圖模擬

遞迴呼叫(入棧)↓

結束呼叫(出棧)↓

然後就懂了。(懶了不想寫了 (>人<;)

洛谷 P2404 自然數的拆分問題

任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。輸入格式 輸入 待拆分的自然數n。輸出格式 輸出 若干數的加法式子。輸入樣例 1 複製 7 輸出樣例 1 複製 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 ...

洛谷 P2404 自然數的拆分問題

任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。輸入格式 輸入 待拆分的自然數n。輸出格式 輸出 若干數的加法式子。輸入樣例 1 複製7 輸出樣例 1 複製1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 ...

洛谷 P2404 自然數的拆分問題

任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。現在給你乙個自然數n,要求你求出n的拆分成一些數字的和。每個拆分後的序列中的數字從小到大排序。然後你需要輸出這些序列,其中字典序小的序列需要優先輸出。輸入 待拆分的自然數n。輸出 若干數的加法式子。輸入 17輸出 11 1 1 1 1 ...