python tcp 檔案下載
阿新 • • 發佈:2020-10-23
題目描述
從 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
輸出樣例
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
解決思路
程式碼實現1,陣列方法
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 30; int n, m; int way[N]; void dfs(int u, int start) { if (u + n - start < m) return; // 剪枝 if (u == m + 1) { for (int i = 1; i <= m; i ++ ) printf("%d ", way[i]); puts(""); return; } for (int i = start; i <= n; i ++ ) { way[u] = i; dfs(u + 1, i + 1); way[u] = 0; // 恢復現場 } } int main() { scanf("%d%d", &n, &m); dfs(1, 1); return 0; }
程式碼實現2,位運算方法
#include <iostream> using namespace std; int n, m; void dfs(int u, int sum, int state) { /* u表示列舉到第幾個數 sum表示當前選了多少個數 state是一個二進位制數表示當前選了哪些數 */ // 把後面數都選上也達不到m個數 if(sum + n - u < m) return; if(sum == m) { for(int i = 0; i < n; i++) if(state >> i & 1) cout << i + 1 << " "; puts(""); return; } if(u == n) return; // 要求從小到大輸出,所以先列舉選擇當前數的情況 dfs(u+1, sum+1, state | 1 << u); dfs(u+1, sum, state); } int main() { cin >> n >> m; dfs(0,0,0); return 0; }