《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩
生活随笔
收集整理的這篇文章主要介紹了
《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目解答
- 題目鏈接
題目解答
分析:
此題和筆者另一篇博文很像,只不過是限定了個數。《算法競賽進階指南》打卡-基本算法-AcWing 92. 遞歸實現指數型枚舉:遞推與遞歸、二進制狀態壓縮、dfs
如果讀者對state >> i & 1這句話有疑問,下面對其進行解釋(下用i代替state):
i >> j & 1這里的運算優先級需要知道: 右移運算符(>>)的優先級高于 位運算,所以這里先計算(i >> j),含義是i的二進制右移j位,也就是找到了i的第j位,然后與1(&1),含義是判斷這一位是否為1.(當然,這里的位,都是指二進制下的某一位)。
綜上,i >> j & 1表示 i的二進制表示中第j位是否為1.
ac代碼
#include<bits/stdc++.h> using namespace std; int n, m;/* u:當前枚舉到第幾個數 sum:當前共選擇了幾個數,是否達到m個的要求 state:判斷某個數是否選上,狀態壓縮,用二進制表示而已。 */void dfs(int u ,int sum, int state){// 滿足m個數啦,可以輸出if(sum == m){for(int i = 0; i < n; i++)if(state >> i & 1) cout<< i + 1 << " ";cout << endl;return;}// n個數都遍歷完了,退出即可。if( u == n) return;//下面是dfs的轉移:分為兩種情況:選不選u這個數。// 選擇當前值u, 個數sum++dfs(u + 1, sum + 1, state | 1 << u);// 不選擇當前值u, 個數sum不變dfs(u + 1, sum, state); }int main(){cin >> n >> m;// 當前枚舉到第幾個數,當前選了多少個數,狀態看看這個數選沒選dfs(0, 0, 0); }題目鏈接
https://www.acwing.com/problem/content/95/
總結
以上是生活随笔為你收集整理的《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《算法竞赛进阶指南》打卡-基本算法-Ac
- 下一篇: 《算法竞赛进阶指南》打卡-基本算法-Ac