#洛谷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 ...