藍橋杯 之 回溯之充分剪枝

文章目錄

    • 買瓜
    • 最大數字

  • 在藍橋杯當中,對于回溯是屬于一個必考的問題,但是除了回溯的幾個基本的問題,如果通過剪枝來提前刪去無效的分支,以大大減少時間復雜度是需要我們進一步思考的問題!
  • 回溯的基本問題:
    • 回溯的初始狀態
    • 回溯的狀態轉移
    • 回溯的結束狀態
  • 其中,這個剪枝的考點就可以在結束狀態部分進行充分的考察
  • 那么這個剪枝有哪些思路與思考?
    • 對于這個n個物體,求和的回溯問題:可以考慮使用前綴和,排序兩個手段進行提前剪枝(以真題買瓜進行深入的分析)

買瓜

買瓜

在這里插入圖片描述

  • 首先按照正常的回溯的思路:

    • 首先考慮在回溯的過程中,我們需要記錄什么參數?
      • 由于要更新這個最終的切西瓜的刀數,所以得設置一個變量記錄當前的切西瓜的刀數
      • 那么當前是切的哪一個西瓜?所以還得記錄一下這個所處理的西瓜的下標
      • 那么怎么知道當前的得到的西瓜的重量?所以還得設置一個變量去記錄當前所得到的西瓜
    • 總的來說,回溯的過程中,需要三個變量(i, k, cursum),分別表示當前處理到的西瓜的下標,當前已經切的西瓜刀數,當前得到的西瓜的重量
  • 考慮這個結束的狀態與更新答案的狀態

    • 結束的狀態:當處理到的西瓜的下標達到n的時候,就返回(因為西瓜的下標是從0開始的,所以當處理到的西瓜的下標到達n就說明已經處理完了)
    • 更新的狀態:當當前的重量等于目標重量的時候,就比較當前的切西瓜的次數與當前的切西瓜的最優次數,進行一個更新
  • 由于有除以2的操作,所以我們可以將這個目標都擴大兩倍,同時將這個西瓜重量也擴大兩倍,這樣就不用除以2

# 對于每個西瓜,可以選擇切與不切
n, m = map(int, input().split())
m = m<<1 
num = list(map(int, input().split()))
a = [i*2 for i in num]
ans = n+1
# 當前的瓜的下標,當前切的刀數,當前的重量
def dfs(i, k, cursum):global ansif cursum == m:ans = min(ans, k)if i == n:return# 不選dfs(i + 1, k, cursum)# 選擇,如果當前的cursum 沒有超過這個mif cursum + num[i] > m:return# 選擇一整個西瓜dfs(i + 1, k, cursum + a[i])# 選擇半個西瓜dfs(i + 1, k + 1, cursum + num[i])
dfs(0,0,0)
print(ans if ans != n+1 else -1)
  • 思考:剪枝不夠充分,目前的剪枝是有對結束狀態的判斷,那么還有什么情況可以考慮?
    • 考慮及時加上全部的西瓜仍然<m,這個時候就沒有必要遞歸下去了,直接結束(難道我們每次都得使用這個sum函數進行求解嗎?當然不是,我們可以使用前綴和進行求解,但是為了方便起見,得將原始的數組和前綴和數組進行轉置)
    • 如果當前的重量已經超過了這個 m就沒有必要繼續遞歸下去了
# 總的來說,m,n是輸入
n,m = map(int,input().split())
m = m << 1
num = list(map(int,input().split()))
num.sort()
a = [i<<1 for i in num]
pre = [0]*n
pre[0] = a[0]
for i in range(1,n):pre[i] = pre[i-1] + a[i]
a = a[::-1]
pre = pre[::-1]
ans = n+1
def dfs(i,k,cursum):global ansif cursum == m :ans = min(ans,k)# if k >= ans:#     returnif i == n or cursum >= m or cursum + pre[i] < m:returndfs(i+1,k,cursum )dfs(i+1,k+1,cursum + a[i] // 2)dfs(i+1,k,cursum + a[i])dfs(0,0,0)
print(ans if ans != n+1 else -1)

最大數字

最大數字
在這里插入圖片描述

  • 錯誤的遞歸思路:每次只要么處理一位操作1要么處理操作2,這樣的處理思路是有問題的,你要么在位數i的時候,直接用完對應的操作1或者操作2,使其變為9,如果不能變為9,那么就盡可能大(操作2是有可能剩余的,但是操作1是不可能剩余的)
  • 包含一點貪心的思路
import os
import sys# 請在此輸入您的代碼# 肯定是按照這個數位進行操作的
N,A,B = map(int,input().split())
N = list(str(N))
n = len(N)
# 需要記錄什么?操作1的次數,操作2的次數,當前操作的是哪一位?
ans = 0
def dfs(i,n1,n2,curnum):global ansif i == n:ans = max(ans,curnum)return # 先進行加法,看看能不能將該位變為9num = int(N[i])ad = min(n1,9-num)n1 -= ad dfs(i+1,n1,n2,curnum*10 + num + ad)n1 += ad # 進行減法if n2 > num:n2 = n2 - (num + 1)dfs(i+1,n1,n2,curnum*10 + 9)n2 = n2 + (num + 1)
dfs(0,A,B,0)
print(ans)

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

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

相關文章

【春招筆試】2025.03.13-螞蟻春招筆試題

題目總結 題目一:區間未出現的最小值之和 1??:統計全為1的子數組數量和全為0的子數組數量,利用公式計算 2??:利用數學公式 n(n+1) - 2N0 - N1 計算最終答案 難度:中等 這道題目的關鍵在于理解 mex 的概念,并發現對于只含 0 和 1 的數組,mex 值只可能是 0、1 或 2。…

iOS 模塊化架構設計:主流方案與實現詳解

隨著 iOS 工程規模的擴大&#xff0c;模塊化設計成為提升代碼可維護性、團隊協作效率和開發靈活性的關鍵。本文將探討為什么需要模塊化&#xff0c;介紹四種主流的模塊化架構方案&#xff08;協議抽象、依賴注入、路由機制和事件總線&#xff09;&#xff0c;并通過代碼示例和對…

太速科技-636-基于FMC的Kintex XCKU060高性能PCIe載板

基于FMC的Kintex XCKU060高性能PCIe載板 一、板卡概述 板卡主控芯片采用Xilinx 公司的 Kintex UltraScale系列FPGA XCKU060-2FFVA1156。板載 2 組 64bit 的DDR4 SDRAM&#xff0c;每組容量2GB&#xff0c;可穩定運行在2400MT/s。支持PCIE Gen3 x8模式及一路FMC HPC接口。同…

【Spring Cloud】 核心組件全解析與 2024 【微服務框架】選型指南

《Spring Cloud 核心組件全解析與 2024 微服務框架選型指南》 第一部分&#xff1a;Spring Cloud 核心組件及功能速查表 組件名稱核心功能一句話總結詳細功能說明Eureka服務注冊與發現的“通訊錄”Server存儲服務節點信息&#xff0c;Client自動注冊和拉取列表&#xff0c;實現…

SAP SD學習筆記31 - 銷售BOM

上一篇講 前受金處理(預付款處理)。 SAP SD學習筆記29 - 前受金處理(預收款處理)_fplt 付款申請與sd 數據表的關聯關系-CSDN博客 本章繼續講SAP SD模塊的其他知識&#xff1a;銷售BOM。 銷售BOM在現場還是會用到的。 目錄 1&#xff0c;銷售BOM概要 2&#xff0c;受注BOM的…

動態路徑規劃——01背包問題講解和通過滾動數組優化

如果沒有動態路徑規劃基礎的兄弟可以出去了&#xff0c;這個題目有兩個問題 第一問講解&#xff1a; 1.定義狀態表示 剛開始我做的時候根據我的經驗定義了一個狀態表示dp[i]表示從1到i個物品中選擇的最大價值&#xff0c;但是這個狀態表示有一個明顯的問題&#xff0c;我怎么知…

Java程序的邏輯控制

目錄 1、順序結構2、分支結構2.1、if 語句2.2、switch 語句 3、循環結構3.1、while 語句3.2、break3.3、continue3.4、for 循環3.5、do while 語句 1、順序結構 順序結構比較簡單&#xff0c;按照代碼書寫的順序一行一行執行。如果調整代碼的書寫順序, 則執行順序也發生變化。…

【鴻蒙開發】Hi3861學習筆記- GPIO之LED

00. 目錄 文章目錄 00. 目錄01. GPIO概述02. 硬件設計03. 軟件設計04. 實驗現象05. 附錄 01. GPIO概述 GPIO&#xff08;General-purpose input/output&#xff09;即通用型輸入輸出。通常&#xff0c;GPIO控制器通過分組的方式管理所有GPIO管腳&#xff0c;每組GPIO有一個或多…

你的完美主義:從缺陷到超能力

所屬專欄&#xff1a;《邏輯辨證系列》 前情回顧&#xff1a; 《完美還是完成》&#xff08;一&#xff09;&#xff1a;完成還是完美—完成大于完美 時間、機會、情緒成本 先完成 … 本期&#xff1a; 《完美還是完成》&#xff08;二&#xff09;&#xff1a;你的完美主…

438.找出字符串中所有字母異位詞

題目&#xff1a; 給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s "cbaebabacd", p "abc" 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 "cba&q…

win32匯編環境,對話框程序中創建托盤示例一

;運行效果 ;win32匯編環境,對話框程序中創建托盤示例一 ;托盤&#xff0c;就是電腦桌面右下角那個角落里的圖標&#xff0c;這里展示基本的應用方法。 ;直接抄進RadAsm可編譯運行。重要部分加備注。 ;下面為asm文件 ;>>>>>>>>>>>>>>…

Ansible相關工具:ansible-doc、ansible

文章目錄 管理方式相關工具ansible-doc命令用法案例 ansibleansible主配置文件日志文件主機清單 ansible命令基本格式&#xff1a;選項說明&#xff1a;ansible的Host-pattern或關系邏輯與邏輯非正則表達式 ansible命令執行過程ansible 的執行狀態 管理方式 利用ansible實現管…

LeetCode 熱題 100_前 K 個高頻元素(73_347_中等_C++)(堆)(哈希表+排序;哈希表+優先隊列(小根堆))

LeetCode 熱題 100_前 K 個高頻元素&#xff08;73_347&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;哈希表排序&#xff09;&#xff1a;思路二&#xff08;哈希表優先隊列&#xff08;小根堆&#xff0…

使用Python在Word中生成多種不同類型的圖表

目錄 工具與環境配置 在 Word 中創建圖表的步驟 在Word中創建柱形圖 在Word中創建條形圖 在Word中創建折線圖 在Word中創建餅圖 在Word中創建散點圖 在Word中創建氣泡圖 在 Word 文檔中插入圖表不僅能更直觀地呈現數據&#xff0c;還能提升文檔的可讀性和專業性。常見的…

項目-個人博客測試報告

目錄 一、項目背景 二、項目功能 三、測試計劃 &#xff08;1&#xff09;功能測試 &#xff08;2&#xff09;自動化測試 &#xff08;3&#xff09;性能測試 一、項目背景 1、個人博客系統是一個操作簡單的基于Spring前后端分離的項目&#xff0c;同時使用MySQL數據庫來進…

前端npm包- CropperJS

文章目錄 一、CropperJS**核心特性****官網與文檔****安裝與使用**1. **通過 npm/yarn/pnpm 安裝**2. **HTML 結構**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相關插件/替代方案****適用場景****注意事項** 總結 一、CropperJS cropperjs 是一個輕量級、功能強大的 圖片裁…

楊輝三角形(信息學奧賽一本通-2043)

【題目描述】 例5.11 打印楊輝三角形的前n(2≤n≤20)行。楊輝三角形如下圖&#xff1a; 當n5時 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 輸出&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 【輸入】 輸入行數n。 【輸出】 輸出如題述三角形。n行&#…

圖論入門【數據結構基礎】:什么是圖?如何表示圖?

圖&#xff08;Graph&#xff09; 是一種非線性數據結構&#xff0c;用于表示對象之間的關系。圖由 頂點&#xff08;Vertex&#xff09; 和 邊&#xff08;Edge&#xff09; 組成&#xff0c;其中頂點表示對象&#xff0c;邊表示對象之間的關系。圖廣泛應用于計算機科學、數學…

如何使用HACS一鍵集成米家與果家設備到HomeAssistant玩轉智能家居

文章目錄 前言1. 下載HACS源碼2. 添加HACS商店3. 綁定米家設備 前言 各位科技潮人和智能家居發燒友們&#xff0c;是不是也夢想著把家里變成一個高科技的空間&#xff1f;有了群暉NAS這位得力助手&#xff0c;不僅存儲空間大得嚇人&#xff0c;還能通過Docker輕松安裝各種應用…

《Java對象“比武場“:Comparable與Comparator的巔峰對決》

目錄 引言&#xff1a; 一、認識接口 1.1 Comparable 1.2 Comparator ?編輯 1.3 核心概念對比 二、代碼實現對比 2.1 Comparable 實現示例 2.2 Comparator 實例示例 三、核心區別詳解 3.1 設計理念差異 3.2 方法調用 3.3 使用情景 四、本質區別總結 引言&#x…