分書問題的遞歸枚舉算法

分數問題的遞歸枚舉算法

  • 一、問題引入
  • 二、解題步驟
    • 1.問題分析思維導圖
    • 2.解題步驟
  • 三、代碼實現
    • 1.代碼
    • 2.復雜度分析
  • 四、個人總結

一、問題引入

分書問題是指:已知 n 個人對 m 本書的喜好(n≤m),現要將 m 本書分給 n 個人,每個人只能分到 1 本書,每本書也最多只能分給 1 個人,并且還要求每個人都能分到自己喜歡的書。列出所有滿足要求的方案。

本題請你對任意 n 和 m 嘗試列出全部的解。

輸入格式:
輸入第一行給出兩個正整數 n 和 m(n≤m≤8),即分書問題中的人數和書的數量。
隨后 n 行,每行給出 m 個關系矩陣元素。其中第 i 行第 j 個元素為 1 表示第 i 個人喜歡第 j 本書,為 0 則表示不喜歡。

輸出格式:
按升序列出所有滿足要求的方案,格式為 (s1,?,sn)。其中 si表示第 i 個人分到了第 si本書。

注:方案 (a1,?,an)<(b1,?,bn) 是指存在 1≤k≤n,使得 ai=bi對所有 1≤i<k 成立,并且有 ak<bk。

輸入樣例:

4 5
0 1 0 0 1
1 1 0 1 0
1 0 1 1 0
0 0 0 1 1

輸出樣例:

(2, 1, 3, 4)
(2, 1, 3, 5)
(2, 1, 4, 5)
(2, 4, 1, 5)
(2, 4, 3, 5)
(5, 1, 3, 4)
(5, 2, 1, 4)
(5, 2, 3, 4)

二、解題步驟

1.問題分析思維導圖

在這里插入圖片描述

2.解題步驟

  1. 問題理解:
    ? 有n個人和m本書,n≤m
    ? 每人只能分到一本自己喜歡的書
    ? 每本書只能分配給一個人
    ? 需要找出所有滿足條件的分配方案
  2. 算法選擇:
    ? 使用回溯算法遞歸枚舉所有可能的分配方案
    ? 通過剪枝(只考慮喜歡的書和未被分配的書)減少不必要的搜索
  3. 實現步驟:
    ? 回溯函數:
    1.終止條件:當所有人都分配了書時,保存當前方案
    2.對于當前人,遍歷所有書:
    ■ 如果書未被分配且當前人喜歡這本書:
    ■ 標記書為已分配
    ■ 遞歸處理下一個人
    ■ 回溯:取消書的分配狀態
    ? 主函數:
    1.讀取輸入:n, m和喜好矩陣
    2.調用回溯函數獲取所有方案
    3.對結果排序并輸出

三、代碼實現

1.代碼

def solve_book_assignment(n, m, preference):def backtrack(person, assigned_books, current_assignment, results):if person == n:# 找到一個完整的分配方案results.append(tuple(current_assignment))returnfor book in range(m):if not assigned_books[book] and preference[person][book]:# 如果書未被分配且當前人喜歡這本書assigned_books[book] = Truecurrent_assignment[person] = book + 1  # 書的編號從 1 開始backtrack(person + 1, assigned_books, current_assignment, results)assigned_books[book] = False  # 回溯results = []assigned_books = [False] * m  # 記錄書是否被分配current_assignment = [0] * n  # 記錄當前分配方案backtrack(0, assigned_books, current_assignment, results)return resultsdef main():n, m = map(int, input().split())preference = []for _ in range(n):row = list(map(int, input().split()))preference.append(row)# 獲取所有分配方案results = solve_book_assignment(n, m, preference)# 按升序輸出for res in sorted(results):print(f"({', '.join(map(str, res))})")if __name__ == "__main__":main()

2.復雜度分析

時間復雜度:O(m!/(m-n)!)
■ 最壞情況下需要枚舉所有排列,即從m本書中選n本的排列數
空間復雜度:O(n+m)

四、個人總結

通過本次實驗,我深入理解了回溯算法在解決組合優化問題中的應用。實驗以分書問題為載體,讓我親身體驗了如何將實際問題轉化為遞歸搜索模型。在實現過程中,我學會了如何設計遞歸函數的終止條件和回溯邏輯,特別是掌握了通過標記數組來避免重復選擇的關鍵技巧。當遇到輸出結果順序不符合要求的情況時,我通過分析比較規則,理解了字典序的本質,最終采用預排序方案解決了輸出順序問題。

調試過程中出現的重復分配錯誤讓我意識到狀態恢復的重要性,這加深了我對回溯算法中"嘗試-撤銷"這一核心思想的理解。通過分析算法復雜度,我認識到雖然回溯法能保證找到所有解,但其時間代價隨問題規模呈階乘級增長,這讓我更加重視剪枝優化的重要性。實驗數據也驗證了理論分析,當n和m接近8時,運行時間明顯增加。

這次實踐不僅讓我掌握了回溯算法的實現細節,更重要的是培養了我將抽象算法轉化為具體代碼的能力。我體會到良好的數據結構設計對算法效率的影響,比如使用布爾數組而非列表來記錄分配狀態可以提升訪問效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79273.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

密碼學--AES

一、實驗目的 1、完成AES算法中1輪加密和解密操作 2、掌握AES的4個基本處理步驟 3、理解對稱加密算法的“對稱”思想 二、實驗內容 1、題目內容描述 &#xff08;1&#xff09;利用C語言實現字節代換和逆向字節代換&#xff0c;字節查S盒代換 &#xff08;2&#xff09;利…

【工具記錄分享】提取bilibili視頻字幕

F12大法 教程很多 但方法比較統一 例快速提取視頻字幕&#xff01;適用B站、AI字幕等等。好用 - 嗶哩嗶哩 無腦小工具 嗶哩嗶哩B站字幕下載_在線字幕解析-飛魚視頻下載助手 把鏈接扔進去就會自動生成srt文件 需要txt可以配合&#xff1a; SRT轉為TXT

使用fdisk 、gdisk管理分區

用 fdisk 管理分區 fdisk 命令工具默認將磁盤劃分為 mbr 格式的分區 命令&#xff1a; fdisk 設備名 fdisk 命令以交互方式進行操作的&#xff0c;在菜單中選擇相應功能鍵即可 [rootlocalhost ~]# fdisk /dev/sda # 對 sda 進行分區 Command (m for help): # 進入 fdis…

【Linux基礎】程序和軟件安裝管理命令

目錄 install命令 which命令 install命令 作用&#xff1a;它是用于安裝或復制文件到指定位置&#xff0c;并且可以同時設置文件的權限、所有者和所屬組等屬性。它通常用于腳本中&#xff0c;用于自動化安裝程序或配置文件的部署。 基本用法&#xff1a; install [選項] 源…

C++模板梳理

目錄 函數模板 類模板 變量模板 模板全特化 模板偏特化 模板顯式實例化解決文件分離問題 折疊表達式 模板的二階段編譯 待決名(dependent name) SFINAE 概念與約束 函數模板 函數模板不是函數&#xff0c;只有實例化的函數模板&#xff0c;編譯器才能生成實際的函數…

數據鏈共享:從印巴空戰到工業控制的跨越性應用

摘要 本文通過對印巴空戰中數據鏈共享發揮關鍵作用的分析&#xff0c;引出數據鏈共享在工業控制領域同樣具有重大價值的觀點。深入闡述 DIOS 工業控制操作系統作為工業數據鏈共享基礎技術的特點、架構及應用優勢&#xff0c;對比空戰場景與工業控制場景下數據鏈共享的相…

巡檢機器人數據處理技術的創新與實踐

摘要 隨著科技的飛速發展&#xff0c;巡檢機器人在各行業中逐漸取代人工巡檢&#xff0c;展現出高效、精準、安全等顯著優勢。當前&#xff0c;巡檢機器人已從單純的數據采集階段邁向對采集數據進行深度分析的新階段。本文探討了巡檢機器人替代人工巡檢的現狀及優勢&#xff0c…

在 Flink + Kafka 實時數倉中,如何確保端到端的 Exactly-Once

在 Flink Kafka 構建實時數倉時&#xff0c;確保端到端的 Exactly-Once&#xff08;精確一次&#xff09; 需要從 數據消費&#xff08;Source&#xff09;、處理&#xff08;Processing&#xff09;、寫入&#xff08;Sink&#xff09; 三個階段協同設計&#xff0c;結合 Fli…

當可視化遇上 CesiumJS:突破傳統,打造前沿生產配套方案

CesiumJS 技術基礎介紹 CesiumJS 是一款基于 JavaScript 的開源庫&#xff0c;專門用于創建動態、交互式的地理空間可視化。它利用 WebGL 技術&#xff0c;能夠在網頁瀏覽器中流暢地渲染高分辨率的三維地球和地圖場景。CesiumJS 支持多種地理空間數據格式&#xff0c;包括但不…

RabbitMQ深入學習

繼續上一節的學習&#xff0c;上一節學習了RabbitMQ的基本內容&#xff0c;本節學習RabbitMQ的高級特性。 RocketMQ的高級特性學習見這篇博客 目錄 1.消息可靠性1.1生產者消息確認1.2消息持久化1.3消費者消息確認1.4消費失敗重試機制1.5消息可靠性保證總結 2.什么是死信交換機…

Linux系統:虛擬文件系統與文件緩沖區(語言級內核級)

本節重點 初步理解一切皆文件理解文件緩沖區的分類用戶級文件緩沖區與內核級文件緩沖區用戶級文件緩沖區的刷新機制兩級緩沖區的分層協作 一、虛擬文件系統 1.1 理解“一切皆文件” 我們都知道操作系統訪問不同的外部設備&#xff08;顯示器、磁盤、鍵盤、鼠標、網卡&#…

在c++中老是碰到string,這是什么意思?

定義一個string類型變量的引用&#xff0c;相當于給現有變量起個別名&#xff0c;與指針還是不一樣的。比如string a;string& ba;這兩句&#xff0c;b與a實際上是一回事&#xff0c;表示的是同一塊內存。 std是系統的一個命名空間(有關命名空間可以參閱namespace_百度百科)…

Day21 奇異值分解(SVD)全面解析

一、奇異值分解概述 奇異值分解是線性代數中一個重要的矩陣分解方法&#xff0c;對于任何矩陣&#xff0c;無論是結構化數據轉化成的“樣本 * 特征”矩陣&#xff0c;還是天然以矩陣形式存在的圖像數據&#xff0c;都能進行等價的奇異值分解&#xff08;SVD&#xff09;。 二…

akshare爬蟲限制,pywencai頻繁升級個人做量化,穩定數據源和券商的選擇

做量化&#xff0c;數據和交易接口是策略和自動化交易的基石&#xff0c;而穩定的數據和快人一步的交易接口是個人做量化的催化劑。 之前寫過一篇文章&#xff1a;個人做量化常用的數據&#xff0c;多以爬蟲為主&#xff0c;最近akshare爬蟲限制&#xff0c;pywencai頻繁升級。…

數字簽名與證書

1. 數字簽名與證書 摘要算法用來實現完整性&#xff0c;能夠為數據生成獨一無二的“指紋”&#xff0c;常用的算法是 SHA-2&#xff1b;數字簽名是私鑰對摘要的加密&#xff0c;可以由公鑰解密后驗證&#xff0c;實現身份認證和不可否認&#xff1b;公鑰的分發需要使用數字證書…

Ubuntu22.04安裝顯卡驅動/卸載顯卡驅動

報錯 今日輸入nvidia-smi報錯,在安裝了535和550,包括560都沒辦法解決,但是又怕亂搞導致環境損壞,打算把顯卡卸載然后重新安裝系統默認推薦版本的顯卡驅動 qinqin:~$ nvidia-smi Failed to initialize NVML: Driver/library version mismatch NVML library version: 560.35卸載…

Web 架構之負載均衡全解析

文章目錄 一、引言二、思維導圖三、負載均衡的定義與作用定義作用1. 提高可用性2. 增強性能3. 實現擴展性 四、負載均衡類型硬件負載均衡代表設備優缺點 軟件負載均衡應用層負載均衡代表軟件優缺點 網絡層負載均衡代表軟件優缺點 五、負載均衡算法輪詢算法&#xff08;Round Ro…

linux下的Redis的編譯安裝與配置

配合做開發經常會用到redis&#xff0c;整理下編譯安裝配置過程&#xff0c;僅供參考&#xff01; --------------------------------------Redis的安裝與配置-------------------------------------- 下載 wget https://download.redis.io/releases/redis-6.2.6.tar.gz tar…

A2A大模型協議及Java示例

A2A大模型協議概述 1. 協議作用 A2A協議旨在解決以下問題&#xff1a; 數據交換&#xff1a;不同應用程序之間的數據格式可能不一致&#xff0c;A2A協議通過定義統一的接口和數據格式解決這一問題。模型調用&#xff1a;提供標準化的接口&#xff0c;使得外部應用可以輕松調…

關鍵點檢測--使用YOLOv8對Leeds Sports Pose(LSP)關鍵點檢測

目錄 1. Leeds Sports Pose數據集下載2. 數據集處理2.1 獲取標簽2.2 將圖像文件和標簽文件處理成YOLO能使用的格式 3. 用YOLOv8進行訓練3.1 訓練3.2 預測 1. Leeds Sports Pose數據集下載 從kaggle官網下載這個數據集&#xff0c;地址為link&#xff0c;下載好的數據集文件如下…