日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

發布時間:2025/4/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 題目解答
      • 題目鏈接

題目解答

分析:
此題和筆者另一篇博文很像,只不過是限定了個數。《算法競賽進階指南》打卡-基本算法-AcWing 92. 遞歸實現指數型枚舉:遞推與遞歸、二進制狀態壓縮、dfs

  • 狀態壓縮,用二進制數中的某一位來表示哪個數選了,哪個數沒選。二進制第i位為1,表示選擇了數 i+1.比如二進制數的第0位表示選擇了1這個數,二進制位中的第3位表示選擇了4這個數。
  • 想好dfs退出的條件。要么是找到了m個數,要么是n個數都遍歷完。
  • 如果讀者對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、状态压缩的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。