洛谷P1120 小木棍

#算法/進階搜索
思路:
首先,最初始想法,將我們需要枚舉的長木棍個數計算出來,在dfs中,我們先判斷,此時枚舉這根長木棍需要的長度是否為0,如果為0,我們就枚舉下一個根木棍,接著再判斷,此時仍需要枚舉的木棍個數是否為0,如果為0,代表我們這種方案可行,直接打印長木棍長度,接著我們再枚舉每一根小木棍,將還沒有訪問的長木棍,以及長度小于還需要的長度的小木棍dfs下去
但顯然這種方法時間復雜度太高,需要剪枝,那么考慮如何剪枝呢?
1.首先,先判斷我們小木棍的總長度是否能被長木棍的長度整除,如果可以,枚舉這根長木棍.
2.優先枚舉長度長的小木棍,這樣可使得枚舉上更加靈活
3.在我們枚舉枚舉短木棍時候,如果我們枚舉上一根木棍的長度與此時準備枚舉的短木棍長度相同,并且,上一根的短木棍方案不行,那么,我們無需再繼續枚舉這根小木棍.
4.如果此時小木棍的長度等于剩余需要的長度,并且此時這根短木棍不滿足要求,那么直接返回

代碼一 無法全部ac

#include<bits/stdc++.h>using namespace std;const int N=66;int a[N];int len[N];//記入相同長度小木棍個數int n;int sum;int d;//長木棍長度//u代表這根小木棍剩余長度,k代表還需要枚舉長木棍個數void dfs(int u,int k){if(u==0){dfs(d,k-1);}if(k==0){cout<<d<<endl;exit(0);}for(int i=n;i>=1;i--){if(a[i]>u)continue;if(len[a[i]]==0)continue;len[a[i]]--;dfs(u-a[i],k);len[a[i]]++;if(a[i]==u)return;}}int main(void){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];len[a[i]]++;}sort(a+1,a+1+n);//剪枝2for(int i=a[n];i<=sum;i++){if(sum%i!=0)continue;//剪枝1d=i;dfs(i,sum/i);}}

在dfs中,我們是通過遍歷每一個小木棍,來進行判斷當前的小木棍是否可以拼接,但每次遍歷的時候都會將所有的小木棍都會遍歷一邊,如果出現多個小木棍長度相同,我們會將所有長度相同的小木棍也遍歷一邊,會浪費許多時間,那么,我們思考,有什么其他的方法能減少這些時間的浪費呢?這時,我們可以考慮枚舉小木棍的長度,我們先定義一個pre數組,存儲每根短木棍的上一個比他短的小木棍,然后,在dfs中,我們每次只需要查找第一根最長且還有剩余量的小木棍即可,這樣就可以避免尋找每一個小木棍的

#include<bits/stdc++.h>using namespace std;const int N=66;int a[N];int len[N];//記入相同長度小木棍個數int n;int pre[N];int sum;int d;//長木棍長度//u代表這根小木棍剩余長度,k代表還需要枚舉長木棍個數,當前小木棍的長度void dfs(int u,int k,int p){if(u==0){dfs(d,k-1,a[n]);}if(k==0){cout<<d<<endl;exit(0);}p=min(p,u);while(p&&len[p]==0)p--;while(p){if(len[p]){len[p]--;dfs(u-p,k,p);len[p]++;if((p==u)||(u==d))return;}p=pre[p];}}int main(void){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];len[a[i]]++;}sort(a+1,a+1+n);//剪枝2for(int i=n;i>=1;i--){if(a[i]!=a[i-1]){pre[a[i]]=a[i-1];}}for(int i=a[n];i<=sum;i++){if(sum%i!=0)continue;//剪枝1d=i;dfs(i,sum/i,a[n]);}}

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

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

相關文章

Linux教程-常用命令系列二

文章目錄 1. 系統管理常用命令1. useradd - 創建用戶賬戶功能基本用法常用選項示例 2. passwd - 管理用戶密碼功能基本用法常用選項示例 3. kill - 終止進程功能基本用法常用信號示例 4. date - 顯示和設置系統時間功能基本用法常用選項時間格式示例 5. bc - 高精度計算器功能基…

18、TimeDiff論文筆記

TimeDiff **1. 背景與動機****2. 擴散模型基礎****3. TimeDiff 模型****3.1 前向擴散過程****3.2 后向去噪過程** 4、TimeDiff&#xff08;架構&#xff09;原理訓練推理其他關鍵點解釋 DDPM&#xff08;相關數學&#xff09;1、正態分布2、條件概率1. **與多個條件相關**&…

整合SSM——(SpringMVC+Spring+Mybatis)

目錄 SSM整合 創建項目 導入依賴 配置文件 SpringConfig MyBatisConfig JdbcConfig ServletConfig SpringMvcConfig 功能模塊 測試 業務層接口測試 控制層測試 SSM是Java Web開發中常用的三個主流框架組合的縮寫&#xff0c;分別對應Spring、Spring MVC、MyBatis…

P1042【深基8,例1】乒乓球

【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革&#xff0c;以推動乒乓球運動在全球的普及。其中 11 分制改革引起了很大的爭議&#xff0c;有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…

ubuntu24.04上使用qemu和buildroot模擬vexpress-ca9開發板構建嵌入式arm linux環境

1 準備工作 1.1 安裝qemu 在ubuntu系統中使用以下命令安裝qemu。 sudo apt install qemu-system-arm 安裝完畢后&#xff0c;在終端輸入: qemu- 后按TAB鍵&#xff0c;彈出下列命令證明安裝成功。 1.2 安裝arm交叉編譯工具鏈 sudo apt install gcc-arm-linux-gnueabihf 安裝之…

用 R 語言打造交互式敘事地圖:講述黃河源區生態變化的故事

目錄 ?? 項目背景:黃河源頭的生態變遷 ?? 技術棧介紹 ??? 最終效果預覽 ?? 項目構建步驟 1?? 數據準備 2?? 構建 Leaflet 地圖 3?? 使用 scrollama 實現滾動觸發事件 4?? 使用 R Markdown / Quarto 打包發布 ?? 效果展示截圖 ?? 完整代碼倉庫 …

CTF--秋名山車神

一、原網頁&#xff1a; 二、步驟&#xff1a; 1.嘗試用計算器計算&#xff1a; 計算器溢出&#xff0c;無法正常計算 2.使用python計算&#xff1a; 得出計算結果為&#xff1a;1864710043732437134701060769 3.多次刷新頁面&#xff1a; 發現變量為value&#xff0c;要用pos…

CRC實戰寶典:從原理到代碼,全面攻克循環冗余校驗

CRC實戰寶典&#xff1a;從原理到代碼&#xff0c;全面攻克循環冗余校驗 github開源&#xff1a;CRC軟硬件協同測試項目 CRC 簡介 CRC&#xff08;循環冗余校驗&#xff09;是一種強大的錯誤檢測技術&#xff0c;廣泛應用于數字網絡和存儲系統。它是確保數據完整性的重要方法…

【大模型】DeepSeek + Coze 打造個人專屬AI智能體使用詳解

目錄 一、前言 二、AI智能體介紹 2.1 什么是AI智能體 2.2 AI智能體核心能力 2.3 AI智能應用場景 三、coze 介紹 3.1 coze是什么 3.1.1 平臺概述 3.1.2 平臺適用人群 3.2 平臺核心功能 3.3 coze可以做什么 3.4 為什么選擇coze 四、coze 搭建AI智能體操作實踐 4.1 搭…

MySQL入門:數據表的創建

?今天我們來介紹一下除HTML外的另一種語言&#xff1a;MySQL語言&#xff1b; MySQL&#xff1a;即一種用于管理和處理關系數據庫的標準語言。要用于執行查詢、更新、管理數據庫中的數據以及定義和操作數據庫結構。 接下來我會逐一介紹它的作用以及其中數據表&#xff0c;數據…

[圖論]生成樹 引言

生成樹 引言 生成樹&#xff1a;一個連通圖的生成樹是該圖的一個極小連通子圖。生成樹中含有圖中全部(設 V V V個)頂點及構成一棵樹的 V ? 1 V-1 V?1條邊&#xff0c;且生成樹中不應有環。最小生成樹(MST)&#xff1a;圖的所有生成樹中&#xff0c;邊權之和最小的生成樹。顯…

AI調試工具有哪些?

一、深度學習框架專用調試工具 TensorBoard ? 功能&#xff1a;實時監控訓練指標&#xff08;損失值、準確率&#xff09;、可視化神經網絡結構、分析參數分布和梯度信息 ? 適用框架&#xff1a;TensorFlow、PyTorch&#xff08;通過插件&#xff09; ? 特點&#xff1a;支持…

深入理解 MCP 協議:開啟 AI 交互新時代

深入理解 MCP 協議&#xff1a;開啟 AI 交互新時代&#x1f680; 在當今人工智能蓬勃發展的時代&#x1f310;&#xff0c;大型語言模型&#xff08;LLM&#xff09;已經在眾多領域展現出了強大的能力&#xff0c;令人驚嘆&#x1f44f;&#xff01;然而&#xff0c;傳統的 LLM…

微信、抖音、小紅書emoji符號大全

1、Emoji 日常符號 &#x1f463;&#x1f440;&#x1f441;?&#x1f444;&#x1f48b;&#x1f442;&#x1f9bb;&#x1f443;&#x1f445;&#x1f9e0;&#x1fac0;&#x1fac1;&#x1f9b7;&#x1f9b4;&#x1f4aa;&#x1f9be;&#x1f9bf;&#x1f9b5;&a…

【嵌入式】——Linux系統遠程操作和程序編譯

目錄 一、虛擬機配置網絡設置 二、使用PuTTY登錄新建的賬戶 1、在ubuntu下開啟ssh服務 2、使用PuTTY連接 三、樹莓派實現遠程登錄 四、樹莓派使用VNC viewer登錄 五、Linux使用talk聊天程序 1、使用linux自帶的talk命令 2、使用c語言編寫一個talk程序 一、虛擬機配置網絡…

春和景明-C語言簡單代碼

題目要求&#xff1a; 請在centOS Linux中編寫一個C語言程序實現如下功能&#xff1a; 同時創建100個用戶&#xff0c;用戶的賬戶名稱為&#xff1a;Student01 Student02 … Student100;設置每個用戶的初始密碼為&#xff1a;stud123456請用gcc編譯C的源代碼&#xff0c;生…

設計模式之工廠模式(factory pattern):在商品對象創建系統中的應用

目錄 一、設計思路 1. 簡單工廠模式 2. 工廠方法模式 3. 抽象工廠模式 二、UML類圖&#xff08;PlantUML格式&#xff09; 1.簡單工廠模式 2.工廠方法模式 3.抽象工廠模式 三、實現過程與結果 1. 簡單工廠模式 2. 工廠方法模式 3. 抽象工廠模式 四、總結 在面向對…

Trae,字節跳動推出的 AI 編程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能編程助手&#xff08;前身為 MarsCode 編程助手&#xff09;&#xff0c;以插件形式集成在本地開發環境中&#xff0c;具備極高的兼容性和靈活性&#xff0c;旨在提升開發效率和代碼質量。它支持超過100種編程語言&#xff0c;兼容主流…

工作紀實_63-Mac電腦使用brew安裝軟件

最近在接觸kafka&#xff0c;想著在自己的電腦安裝一套環境&#xff0c;docker也能行&#xff0c;但是還是想裝一些原生的軟件試試看&#xff0c;因此便想著整理一下brew的命令&#xff0c;這命令確實是方便&#xff0c;不需要下載tar包亂八七糟的東西&#xff0c;一鍵安裝 bre…

Python語法系列博客 · 第8期[特殊字符] Lambda函數與高階函數:函數式編程初體驗

上一期小練習解答&#xff08;第7期回顧&#xff09; ? 練習1&#xff1a;找出1~100中能被3或5整除的數 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]? 練習2&#xff1a;生成字符串長度字典 words ["apple", "banana", "grape…