遞迴實現組合型列舉

2021-09-24 15:48:09 字數 1550 閱讀 4164

從 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個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次...