剪枝是一種優化演算法,通過剪掉不合理的搜尋來減少搜尋時間。
剪枝通常分為以下兩類:
可行性剪枝
最優化剪枝
最優化剪枝:又稱為上下界剪枝,是一種重要的搜尋剪枝策略。它記錄當前得到的最優值,如果當前結點已經無法產生比當前最優解更優的解時,可以提前回溯。
例題(小木棍):
題目描述最優性剪枝:喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過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 的所有真子集的組合和排列。求出所有真子集可能全排列的方法為求...