從 1 ~ n 這 n 個整數中隨機選取 m 個數,輸出所有可能的選擇方案。
輸入格式
兩個整數 n , m , 在同一行用空格隔開。
輸出格式
按照從小到大的順序輸出所有方案,每行 1 個。
首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。
其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。
資料範圍n
>
0n > 0
n>00≤m
≤n
0 ≤ m ≤ n
0≤m≤nn+(
n−m)
≤25
n+(n−m)≤25
n+(n−m
)≤25
輸入樣例:
5 3
輸出樣例:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
本題目是一道基本的遞迴題目,而且這是一種 「選或不選且有個數限制」 型別的列舉順序。
遞迴需要儲存排列的資料,這裡使用兩種方式進行儲存。另外由於對輸出序列存在字典序要求,因此遞迴需要先選擇該數,然後不選擇該數。這樣得到的才是符合字典序要求的。
其一使用全域性陣列儲存。
所有遞迴資料使用乙個全域性陣列儲存需要注意的是,在遞迴呼叫後需要還原狀態。
#include #include using namespace std;
int n,m;
vectorresult;
void dfs(int index)
if(result.size() == m)
cout << endl;
return ;
}result.push_back(index + 1);
dfs(index + 1);
result.pop_back();
dfs(index + 1);
}int main()
其二使用函式引數儲存,使用位運算表示(當前位為1表示該位表示的數存在)。
#include using namespace std;
int n,m;
void dfs(int index,int sum,int status)
if(sum == m)
}cout << endl;
return ;
}dfs(index + 1,sum + 1,status | 1 << index);
dfs(index + 1,sum,status);
}int main()
遞迴實現組合型列舉
題目 從 1 n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。輸入格式 兩個整數 n,m 在同一行用空格隔開。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面 ...
遞迴實現組合型列舉
遞迴實現組合型列舉 93.遞迴實現組合型列舉 題目提交記錄 討論題解 從 1 n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。輸入格式 兩個整數 n,mn,m 在同一行用空格隔開。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開...
遞迴實現組合型列舉
時間限制 1 sec 記憶體限制 128 mb 提交 狀態 題目描述 從 1 n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。n 0,0 m n,n n m 25。輸入乙個整數n。輸出按照從小到大的順序輸出所有方案,每行1個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次...