深搜的剪枝技巧 小木棍

2021-08-21 21:35:23 字數 1218 閱讀 7371

時間限制: 1 sec  記憶體限制: 128 mb

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。

現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。

給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。

輸入檔案共有二行。

第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中n≤60。

第二行為n個用空個隔開的正整數,表示n根小木棍的長度。

輸出檔案僅一行,表示要求的原始木棍的最小可能長度。

9

5 2 1 5 2 1 5 2 1

6
題解:

可以依次列舉所有可能的長度len,用深搜判斷是否能用截斷後所有的小木棍拼出整數個len,找出最小的len

最優性剪枝:

1、設所有木棍的長度和是sum,那麼原長度一定能夠被sum整除,不然就沒法拼了

2、木棍原來的長度一定大於等於所有木棍中最長的那根

可行性剪枝:

3、短小的木棍可以更靈活,可以對輸入的木根從大到小排序

4、當用木棍i拼合時,可以從第i+1後的木棍開始搜尋,因為根據優化1,前面的木棍已經用過了

5、用當前最長的木棍開始搜尋,如果拼不出當前設定的原木棍的長度,則直接返回,換乙個原始木根長度

6、相同長度的木棍不要搜尋多次,用當前木棍的長度搜下去得不到結果時,用一支同樣長度的還是得不到結果,所以,可以提前返回

7、判斷搜到的幾根木棍組成的長度是否大於原始長度len,如果大於,沒必要搜下去,提前返回

#include #include #include using namespace std;

int n,sum=0,a[60],len,m,temp,minn=0,used[60];

bool cmp(int x,int y)

void read()

sort(a,a+n,cmp); //剪枝3,從大到小排序,長木棍的靈活性差,先排長木棍

}void dfs(int k,int last,int rest) //第k根木棍,last為第k根上一節木棍編號,rest為第k根木棍還需要的長度

if (rest==0) //開始下一根木棍

}}void solve()

}}int main ()

深搜剪枝 小木棍

時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 5 提交 狀態 討論版 命題人 add cy 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設...

深搜的剪枝技巧

概述 搜尋演算法的時間複雜度大多是指數級的,難以滿足對程式執行時間的限制要求,為使降低時間複雜度,對深度優先搜尋可以進行一種優化的基本方法 剪枝。搜尋的程序可以看做是從樹根出發,遍歷一顆倒置樹 搜尋樹 的過程,所謂剪枝,就是通過某些判斷,避免一些不必要的遍歷過程,形象的說,就是減去搜尋樹中的某些枝條...

深搜的剪枝技巧

首先是深搜的模板 int ans 最壞情況,now now為當前答案 void dfs 傳入數值 1.剪枝的概念 實際上,對於搜尋,其實就是一棵樹 樹醜,莫要介意 那麼對於沒有剪枝的dfs,需要搜尋整棵樹,而剪枝,就是將其中一部分枝幹減掉,使時間複雜度降低。2.剪枝的原則 三個原則 正確性 這是剪枝...