藍橋杯備賽筆記(一) 深度優先搜尋中的剪枝

2021-09-12 11:49:34 字數 1768 閱讀 1388

剪枝是一種優化演算法,通過剪掉不合理的搜尋來減少搜尋時間。

剪枝通常分為以下兩類:

可行性剪枝

最優化剪枝

最優化剪枝:又稱為上下界剪枝,是一種重要的搜尋剪枝策略。它記錄當前得到的最優值,如果當前結點已經無法產生比當前最優解更優的解時,可以提前回溯。

例題(小木棍):

題目描述

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

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

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

輸入

輸入檔案共有二行。

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

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

輸出

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

樣例輸入

5 2 1 5 2 1 5 2 1

樣例輸出

最優性剪枝:

1、設所有木棍的長度和是sum,如果原長度不能夠被sum整除,那麼不成立

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

可行性剪枝:

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

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

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

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

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

**:#include"stdafx.h"

#include #include int a[100];

bool a_[100];

int n=0;

int cnt=0;

int num=0;

int cmp(const void *elem1,const void *elem2) //qsort比較函式

bool find_com(int ucnt,int temp,int ans,int s)

int sample=-1;

for(j=s;jtemp)

continue;

a_[j]=true;//規模減小

if(temp-a[j]==0)

else

a_[j]=false;

sample=a[j];

if(temp==ans||temp==a[j]) //剪枝條件5!!!

break;//第乙個都匹配不成功不用進行下面的

} return false; }

int main()

{ //freopen("in.txt","r",stdin);

int sum=0;

scanf("%d",&n); //木棍數量

while(n!=0)

{ sum=0;

int i=0;

int ucnt=n;

bool find=false;

//cnt=0;

for(i=0; i參考:

藍橋杯備賽筆記 規律題

今年大三,開始準備藍橋杯大賽,在做了第七屆以及第六屆的題以後,對於藍橋杯的考點以及考查方式有了一定的了解,這裡做乙個小結。藍橋杯的考察點每年都會考三類題型,第一種是規律題,典型特徵是給出乙個變化情況,讓你來找出其中的規律,並且根據這個規律開回答它的問題。第二種是考察對於暴力求解的方法的理解與使用情況...

藍橋杯備賽筆記 暴力解法

今天是做比賽總結的第二天,今天總結的是用暴力解法解決題目。這種方法常常用在解決例如湊算式等問題的求解上,思路比較簡單,所以考點一般設定在對於細節的處理上面,換句話講,如果細節處理不當,很容易造成丟分。具體來說,有這麼一道題,就是典型的暴力解法 第七屆藍橋杯第三題 的應用 湊算式b def a 10 ...

藍橋杯備賽筆記 01 遞迴列舉演算法

思路2 狀態壓縮 排列型列舉 組合型列舉 例題 這是博主準備藍橋杯的時候的學習筆記,今天是準備的第一天,學習列舉演算法。本文是博主在學習的時候做的一些筆記整合。題目鏈結 遞迴實現指數型列舉 指數型列舉,實際就是求出集合 a 0,1,2,n 的所有真子集的組合和排列。求出所有真子集可能全排列的方法為求...