acwing 93. 遞迴實現組合型列舉
從 1~n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。
輸入格式
兩個整數 n,m ,在同一行用空格隔開。
輸出格式
按照從小到大的順序輸出所有方案,每行1個。
首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。
其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。
資料範圍
n>0 ,
0≤m≤n ,
n+(n−m)≤25
輸入樣例:
5
3
輸出樣例:
123
1241
2513
4135
1452
3423
5245345
思考題:如果要求使用非遞迴方法,該怎麼做呢?
這道題對我們來說應不是很難,但是我第一次開始的時候用的是狀態壓縮試了一下。
#include
using
namespace std;
intmain
(void)if
(cnt==m)
puts(""
);}}
}
這個方法是可以列舉出所有的組合,但是。
仔細觀察的話就發現,其實順序不是很對。
我就用遞迴試了一下,寫了這個**
#include
using
namespace std;
intmain
(void)if
(cnt==m)
puts(""
);}}
}
其實這是ac了,但是我覺得時間複雜度很高,而且還有很多判斷過程應該不是最優解。
然後我就試試不用遞迴,稍微改了一下**。
這個執行時間確實真的太理想了。
AcWing 93 遞迴實現組合型列舉(遞迴)
題目 關於時間複雜度的分析 因為還有輸出,每個組合最多需要輸出13次 最後答案 520030013 67603900 自己超時的 雖然超時了,但是這是自己認真改寫的,下次繼續加油!這是基於 acwing 94 遞迴實現排列型列舉 題改寫的,94題沒有 每一行從小到大排序的規則 這題需要加上 使輸出從...
93 遞迴實現組合型列舉
原題鏈結 include include include include using namespace std const int maxn 30 int n,m int position maxn pos標識m個空中的當前位置,index標識在n個數中遍歷的起始位置 void dfs int p...
93 遞迴實現組合型列舉
根據92.遞迴實現指數型列舉裡的思路,我們只需要在上面指數型列舉程式的calc函式開頭新增以下這條語句即可 if chosen.size m chosen.size n x 1 m 這就是所謂的 剪枝 尋找變換路線其實就是 搜尋 的過程,如果能夠及時確定當前問題一定是無解的,就不需要達到問題的邊界才...