DFS剪枝

剪枝

將搜索過程中一些不必要的部分剔除掉,因為搜索過程構成了一棵樹,剔除不必要的部分,就像是在樹上將樹枝剪掉,故名剪枝

剪枝是回溯法中的一種重要優化手段,方法往往先寫一個暴力搜索,然后找到某些特殊的數學關系,或者邏輯關系,通過它們的約束讓搜索樹盡可能淺而小,從而達到降低時間復雜度的目的。

一般來說剪枝的復雜度難以計算。

例題

藍橋oj2942數字王國之軍訓排隊

問題描述

數字王國開學了,它們也和我們人類一樣有開學前的軍訓,現在一共有 n 名學生,每個學生有自己的一個名字 ai?(數字王國里的名字就是一個正整數,注意學生們可能出現重名的情況),此時叛逆教官來看了之后感覺十分別扭,決定將學生重新分隊。

排隊規則為:將學生分成若干隊,每隊里面至少一個學生,且每隊里面學生的名字不能出現倍數關系(注意名字相同也算是倍數關系)。

現在請你幫忙算算最少可以分成幾隊?

例:有 4 名學生 (2,3,4,4),最少可以分成 (2,3)、(4)、(4) 共 3 隊。

輸入格式

第一行包含一個正整數 n,表示學生數量。

第二行包含 n 個由空格隔開的整數,第 i 個整數表示第 i 個學生的名字 ai?。

輸出格式

輸出共 1 行,包含一個整數,表示最少可以分成幾隊。

樣例輸入

4
2 3 4 4

樣例輸出

3

解1.不剪枝

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 15;
int a[N],n;vector<int>v[N];//v[i]表示第i組里面所有人的編號//cnt表示隊伍數量,dfs返回在cnt個隊伍的情況下是否可以成功分組bool dfs(int cnt, int dep)
{if (dep == n + 1){//說明每個人都成功分組了//檢查當前方案的合法性for (int i = 1; i <= cnt; i++)//每個隊伍枚舉里面所有的二元組{for (int j = 0; j < v[i].size(); j++){for (int k = j+1; k < v[i].size(); k++){if (v[i][k] % v[i][j] == 0)return false;}}}return true;}//枚舉每個人所屬的隊伍for (int i = 1; i <= cnt; i++){v[i].push_back(a[dep]);if (dfs(cnt, dep + 1))return true;//恢復現場v[i].pop_back();}return false;
}int main()
{// 請在此輸入您的代碼cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];sort(a + 1, a + 1 + n);//枚舉n個for (int i = 1; i <= n; i++){if (dfs(i, 1))//i個隊伍,從第一層開始搜索,看這種情況是否可以裝的下(即成功分組){cout << i << endl;break;}}return 0;
}

解2.剪枝(我沒太懂,先放著)

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 15;
int a[N],n;vector<int>v[N];//v[i]表示第i組里面所有人的編號//cnt表示隊伍數量,dfs返回在cnt個隊伍的情況下是否可以成功分組bool dfs(int cnt, int dep)
{if (dep == n + 1){//說明每個人都成功分組了//檢查當前方案的合法性for (int i = 1; i <= cnt; i++)//每個隊伍枚舉里面所有的二元組{for (int j = 0; j < v[i].size(); j++){for (int k = j+1; k < v[i].size(); k++){if (v[i][k] % v[i][j] == 0)return false;}}}return true;}//枚舉每個人所屬的隊伍for (int i = 1; i <= cnt; i++){bool tag = true;
for(const auto &j:v[i])if (a[dep] % j == 0){tag = false;break;}
if (!tag)continue;v[i].push_back(a[dep]);if (dfs(cnt, dep + 1))return true;//恢復現場v[i].pop_back();}return false;
}int main()
{// 請在此輸入您的代碼cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];sort(a + 1, a + 1 + n);//枚舉n個for (int i = 1; i <= n; i++){if (dfs(i, 1))//i個隊伍,從第一層開始搜索,看這種情況是否可以裝的下(即成功分組){cout << i << endl;break;}}return 0;
}

?

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

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

相關文章

超詳細紅黑樹的模擬實現

前言 有人說設計出AVL樹的的人是個大牛&#xff0c;那寫紅黑樹&#xff08;RBTree&#xff09;的人就是天才&#xff01; 上一篇文章&#xff0c;我們已經學習了AVL樹&#xff0c;牛牛個人認為AVL樹已經夠優秀了&#xff0c;那讓我們一起探究一下&#xff0c;為什么紅黑樹比AV…

鏈表類型題目

文章目錄 簡介鏈表的常用技巧兩數相加原理代碼代碼|| 兩兩交換鏈表中的節點代碼原理 重排鏈表(重要)原理代碼 合并 K 個升序鏈表代碼遞歸代碼 K 個一組翻轉鏈表原理代碼 簡介 大家好,這里是jiantaoyab,這篇文章給大家帶來的是鏈表相關的題目練習和解析,希望大家能相互討論進步 …

[線代]自用大綱

部分內容整理自張宇和網絡 序 題型分布&#xff1a; 題型單題分值題目數量總分值選擇題5315填空題515解答題12112 *一道大題可能用到六部分所有知識 矩陣 性質 k k k倍和乘積行列式 ∣ k A ∣ k n ∣ A ∣ |kA|k^n|A| ∣kA∣kn∣A∣ ∣ A B ∣ ≠ ∣ A ∣ ∣ B ∣ |AB|≠…

DDE圖像增強

DDE&#xff08;Detail and Darkness Enhancement&#xff0c;細節和暗部增強&#xff09;是一種用于增強圖像細節和暗部區域的方法。其原理可以簡要概括如下&#xff1a; 細節增強&#xff1a;在圖像中突出顯示細節信息&#xff0c;使得圖像更加清晰和具有視覺沖擊力。這可以通…

藍橋杯刷題--python-15-二分(進階)

503. 借教室 - AcWing題庫 n,mmap(int,input().split()) class_list(map(int,input().split())) class_[0]class_ d[0] s[0] t[0] for _ in range(m): dj,sj,tjmap(int,input().split()) d.append(dj) s.append(sj) t.append(tj) def check(k): b[0]*(n2) …

如何解決微服務的數據一致性分發問題?

介紹 系統架構微服務化以后,根據微服務獨立數據源的思想,每個微服務一般具有各自獨立的數據源,但是不同微服務之間難免需要通過數據分發來共享一些數據,這個就是微服務的數據分發問題。Netflix/Airbnb等一線互聯網公司的實踐[參考附錄1/2/3]表明,數據一致性分發能力,是構…

在嵌入式設備中用多項式快速計算三角函數和方根

慣性傳感器的傾角計算要用到三角函數. 在 MCS-51, Cortex M0, M3 之類的芯片上編程時, 能使用的資源是非常有限, 通常只有兩位數KB的Flash, 個位數KB的RAM. 如果要使用三角函數和開方就要引入 math.h, 會消耗掉10KB以上的Flash空間. 在很多情況下受硬件資源限制無法使用 math.…

【 10X summary report】怎么看?詳細解讀筆記

報告內容 在開始正式的分析之前&#xff0c;需要查看在對齊和計數過程中生成的任何總結統計信息。下圖是由Cell Ranger工具創建的10X總結報告&#xff0c;在從10X scRNA-seq實驗生成計數矩陣時會生成。 The left half of the report describes sequencing and mapping statist…

賣wordpress網站模板的網站

WP模板牛 http://www.wpniu.com 上面有很多免費wordpress模板資源的網站&#xff0c;除了免費模板&#xff0c;還有付費模板。 My模板(我的模板) http://www.mymoban.com 老牌網站模板資源站&#xff0c;上面有wordpress模板、帝國CMS模板、WooCommerce模板可以直接免費下載…

Linux whois命令教程:查詢域名所有者信息(附案例詳解和注意事項)

Linux whois命令介紹 whois命令是一個用于查詢域名所有者信息的工具。它可以直接從命令行進行查詢&#xff0c;這對于沒有圖形用戶界面的系統或者需要在shell腳本中進行查詢的情況非常有用。 Linux whois命令適用的Linux版本 whois命令在大多數Linux發行版中都可以使用&…

C++之stack

1、stack簡介 stack是實現的一個先進后出&#xff0c;后進先出的容器。它只有一個出口&#xff0c;只能操作最頂端元素。 2、stack庫函數 &#xff08;1&#xff09;push() //向棧壓入一個元素 &#xff08;2&#xff09;pop() //移除棧頂元素 &#xff08;3…

基于springboot+vue的中國陜西民俗網

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

在 Angular 中使用 Renderer2

Renderer2 類 Renderer2 類是 Angular 提供的一個抽象服務&#xff0c;允許在不直接操作 DOM 的情況下操縱應用程序的元素。這是推薦的方法&#xff0c;因為它使得更容易開發可以在沒有 DOM 訪問權限的環境中渲染的應用程序&#xff0c;比如在服務器上、在 Web Worker 中或在原…

Java如何剪切視頻

背景&#xff1a;如何使用Java批量切割視頻 FFmpeg 是一個強大的開源多媒體處理工具&#xff0c;被廣泛應用于音視頻的錄制、轉碼、編輯等方面。它支持幾乎所有主流的音視頻格式&#xff0c;能夠在各種操作系統平臺上運行&#xff0c;包括 Windows、macOS 和 Linux。FFmpeg 提…

nginx,php-fpm

一&#xff0c;Nginx是異步非阻塞多進程&#xff0c;io多路復用 1、master進程&#xff1a;管理進程 master進程主要用來管理worker進程&#xff0c;具體包括如下4個主要功能&#xff1a; &#xff08;1&#xff09;接收來自外界的信號。 &#xff08;2&#xff09;向各worker進…

SAP PP學習筆記04 - BOM2 -通過Serial來做簡單的BOM變式配置,副明細,BOM狀態,BOM明細狀態,項目種類,遞歸BOM

本章繼續講BOM。 本章講通過Serial來做簡單的BOM變式配置。還講了BOM的相關概念&#xff1a;副明細&#xff0c;BOM狀態&#xff0c;BOM明細狀態&#xff0c;項目種類&#xff0c;遞歸BOM 等。 1&#xff0c;通過Serial&#xff08;序列號&#xff09;來做簡單的 VC&#xff0…

spring自定義注解之-ElementType.METHOD方法級注解聲明

自定義注解類型和常用場景 可以參考之前的文章 &#xff1a; ElementType.FIELD字段級注解聲明 如果在項目中&#xff0c;多處地方都需調用到同一個方法進行邏輯處理&#xff0c;且與方法的業務邏輯無關&#xff0c;比如監控&#xff0c;日志等&#xff0c;則可用自定義的方法…

【JavaSE】面向對象——繼承性

繼承性 繼承性的概念 所謂繼承&#xff0c;就是程序猿在保持原有類特性的基礎上進行擴展&#xff0c;增加新功能&#xff0c;這樣的類被稱為派生類或者子類&#xff0c;原有類被稱為超類或者基類。 在對于繼承性概念進行書寫前&#xff0c;我曾查閱許多資料來保證對其表達的…

Some collections -- 2024.3

一、TensorFlow Android (dataset: Mnist) We used TensorFlow to define and train our machine learning model, which can recognize handwritten numbers, called a number classifier model in machine learning terminology. We transform the trained TensorFlow mod…

C++學習第五天(內存管理)

1、內存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);int…