AcW木棒-XMUOJ恢復破碎的符咒木牌-DFS與剪枝

題目

思路

話不多說,直接上代碼

代碼

/*
AcW木棒-XMUOJ恢復破碎的符咒木牌 
搜索順序:從小到大枚舉最終的長度 len從前往后依次拼每根長度為len的木棍 
優化:
1.優化搜索順序:優先選擇深度短的來搜索,故從大到小去枚舉
2.排除冗余的方案:每一根長木棍的內部的編號遞增(排列方案變為組合方案)、
3.可行性剪枝:(1)當前第i根木棍失敗,跳過與當前木棍長度相等的其他木棍 (2)拼了幾根長木棍后,要拼新的木棍,第一個未被用過的木棍,如果作為新長木棍的第一段,無解,則直接回溯(3)拼了幾根長木棍后,要拼最后一段的木棍,當前小木棍加入使得當前長木棍滿足,但是剩余的木棒拼不出長木棒,無解,回溯 
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=70;
int w[N];//當前木棍的長度 
bool st[N];//是否用過
int sum,len; //當前木棍的總長度,枚舉的長度 
int n;
//u:當前正在構造第幾根長木棍
//cur:當前正在拼的長木棍的長度
//start: 當前長木棍中小木棍的下標 
bool dfs(int u,int cur,int start){if(u*len==sum)return true;//排完所有的小木棍了 if(cur==len)return dfs(u+1,0,0);//當前長木棍已經排好 for(int i=start;i<n;i++){if(st[i] )continue;//如果已經用過 if(cur+w[i]<=len){st[i]=true;if(dfs(u,cur+w[i],i+1)) return true;st[i]=false;//恢復現場 }if(!cur||cur+w[i]==len) return false;//到達這一步說明前面已經無解 int j=i;while(j<n&&w[i]==w[j])j++;//把與i相等的跳過i=j-1;//恢復下標 } return false;
}int main(){while(cin>>n,n){sum=len=0;for(int i=0;i<n;i++){cin>>w[i];sum+=w[i];len=max(len,w[i]);} sort(w,w+n,greater<int>()); memset(st,0,sizeof st);while(true){if(sum%len==0&&dfs(0,0,0)){cout<<len<<endl;break;}len++;}}return 0;
}

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

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

相關文章

【系統分析師】WEB開發-案例

文章目錄 1、WEB開發涉及內容1.1 負載均衡技術1.2 數據庫讀寫分離1.3 緩存 緩解讀庫壓力1.4 CDN1.5 WEB應用服務器1.6 整體結構1.6 相關技術1.6.1 redis相關(集群、持久化等)1.6.2 XML與JSON1.6.3 REST1.6.4 響應式web設計1.6.5 關于中臺1.6.6 Web系統分層 1、WEB開發涉及內容 …

Python--面向對象

面向對象?? 1. 面向對象和面向過程思想 面向對象和面向過程都是一種編程思想,就是解決問題的思路 面向過程&#xff1a;POP(Procedure Oriented Programming)面向過程語言代表是c語言面向對象&#xff1a;OOP(Object Oriented Programming)常見的面向對象語言包括:java c g…

19c數據庫19.9以下dg切換打開hang住問題

原主庫發起切換請求&#xff0c;原主庫正常切換數據庫角色&#xff0c;但原從庫無法正常打開數據庫&#xff0c;嘗試關閉重啟&#xff0c;依舊無法解決問題。 查看切換過程中原從庫數據庫后臺日志&#xff0c;發現數據庫一直不斷重試清理 SRLs&#xff0c; 后臺alert日志&…

力扣HOT100 - 21. 合并兩個有序鏈表

解題思路&#xff1a; class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dum new ListNode(0), cur dum;while (list1 ! null && list2 ! null) {if (list1.val < list2.val) {cur.next list1;list1 list1.next;} els…

基本IO接口

引入 基本輸入接口 示例1 示例2&#xff1a;有數據保持能力的外設 #RD端由in指令控制&#xff1a;將數據由端口傳輸到CPU內存中 #CS244信號由譯碼電路實現 示例3&#xff1a; a)圖中由于輸出端口6有連接到端口1&#xff0c;當開關與端點1閉合時期間&#xff0c;仍能維持3端口…

插件:NGUI

一、版本 安裝完畢后重啟一下即可&#xff0c;否則可能創建的UI元素不生效 二、使用 Label文字 1、創建Canvs 2、只有根節點的這些腳本全部展開才能鼠標右鍵創建UI元素 3、選擇字體 Sprite圖片 1、選擇圖集 2、選擇圖集中的精靈 Panel容器 用來裝UI的容器&#xff0c;一般UI…

設計模式-策略模式-使用

設計模式-策略模式-CSDN博客 系統中有很多類&#xff0c;它們之間的區別僅在于它們的行為。策略模式可以定義一系列的算法&#xff0c;并將它們一個個封裝起來&#xff0c;使它們可以相互替換。這樣&#xff0c;算法就可以獨立于使用它的客戶而變化。需要使用算法的不同變體。…

《計算機網絡微課堂》2-5 信道的極限容量

本節課我們介紹信道極限容量的有關問題。 我們都知道信號在傳輸過程中會受到各種因素的影響&#xff0c;如圖所示&#xff0c;這是一個數字信號&#xff0c;??當它通過實際的信道后&#xff0c;波形會產生失真&#xff0c;當失真不嚴重時&#xff0c;在輸出端??還可根據以失…

Redis實現熱點數據排行榜或游戲積分排行榜

數據庫中的某張表中存儲著文章的瀏覽量&#xff0c;或者點贊數等&#xff0c;或者游戲積分等數據...... 這些數據的更新在redis中完成&#xff0c;并定時同步到mysql數據庫中。 而如果要對這些數據進行排序的話&#xff1a; Redis中的Sorted Set(有序集合)非常適合用于實現排…

vue源碼2

vue之mustache庫的機理其實是將模板字符串轉化為tokens 然后再將 tokens 轉化為 dom字符串&#xff0c;如下圖 對于一般的將模板字符串轉化為dom字符串&#xff0c;這樣不能實現復雜的功能 let data {name:小王,age:18 } let templateStr <h1>我叫{{name}},我今年{{ag…

centos7 服務開機自啟動 - systemctl -以禪道為例

在服務器上安裝的各種中間件&#xff0c;一般都需要配置成開機自啟動。但是有些中間件的安裝過程中并沒有提供相關配置開機自啟動的說明文檔。本文總結一下Centos7通過systemctl enble配置服務自啟動的方法。一、Centos7通過systemctl enble配置服務自啟動 在Centos7后&#x…

GraphSAGE

GraphSAGE 節點采樣&#xff1a;聚合&#xff08;Aggregation&#xff09;&#xff1a;更新&#xff08;update&#xff09;&#xff1a;例子&#xff1a;總結&#xff1a; 啥是GraphSAGE呢&#xff1f; 是一種用于圖嵌入的無監督學習方法。 通過采樣和聚合鄰居節點的信息來生成…

【一步一步了解Java系列】:Java中的方法對標C語言中的函數

看到這句話的時候證明&#xff1a;此刻你我都在努力~ 加油陌生人~ 個人主頁&#xff1a;Gu Gu Study 專欄&#xff1a;一步一步了解Java 喜歡的一句話&#xff1a; 常常會回顧努力的自己&#xff0c;所以要為自己的努力留下足跡。 _ 如果喜歡能否點個贊支持一下&#xff0c;謝謝…

Xfce4桌面背景和桌面圖標消失問題解決@FreeBSD

問題&#xff1a;Xfce4桌面背景和桌面圖標消失 以前碰到過好幾次桌面背景和桌面圖標消失&#xff0c;整個桌面除了上面一條和下面中間的工具條&#xff0c;其它地方全是黑色的問題&#xff0c;但是這次重啟之后也沒有修復&#xff0c;整個桌面烏黑一片&#xff0c;啥都沒有&am…

認知V2X的技術列一個學習大綱

為了深入學習和理解V2X&#xff08;Vehicle to Everything&#xff09;技術&#xff0c;以下是一個學習大綱的概述&#xff0c;結合了參考文章中的相關數字和信息&#xff1a; 一、V2X技術基礎 V2X概述 定義&#xff1a;V2X是車用無線通信技術&#xff0c;將車輛與一切事物相連…

WebService相關內容

WebService中的wsdl什么意思? WSDL(Web Services Description Language)Web服務描述語言及其功能、操作、參數和返回值的XML格式的語言。它在Java和其他編程語言中都可以使用,用于定義Web服務的接口以及如何與這些服務進行交互。 WSDL的作用 WSDL的主要作用是提供一種標準…

idea上傳git命令

git init git remote add origin git add . git commit -m "標題" git push -u origin master

Qt 模型視圖詳細介紹

一.文件系統模型&#xff08;QFileSystemModel&#xff09; 1.定義 QFileSystemModel 是 Qt 框架中的一個類&#xff0c;它提供了一個用于管理文件系統結構的模型。它可以用于顯示文件系統的目錄結構&#xff0c;以及在視圖中顯示文件和文件夾的詳細信息。 這個模型將文件系統…

15分鐘Element-UI快速入門

Element-UI 是一個基于 Vue.js 2.0 的桌面端組件庫&#xff0c;它提供了豐富的、可復用的組件&#xff0c;幫助開發者快速構建出美觀且功能強大的網頁應用。以下是一個 Element-UI 的快速入門指南&#xff1a; 1. 安裝 Element-UI 首先&#xff0c;你需要在你的 Vue.js 項目中…

各種測試方法,黑盒測試、白盒測試,靜態測試,動態測試

1.測試方法 軟件測試方法的分類有很多種&#xff0c;以測試過程中程序執行狀態為依據可分為靜態測試 (Static Testing,ST) 和動態測試 (Dynamic Testing,DT); 以具體實現算法細節和系統內部結構的相 關情況為根據可分黑盒測試、白盒測試和灰盒測試3類&#xff1b;從程序執行的方…