DFS 剪枝(經典例題)

2021-10-09 02:21:08 字數 1660 閱讀 9318

描述

喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。

輸入

輸入包含多組資料,每組資料報括兩行。第一行是乙個不超過64的整數,表示砍斷之後共有多少節木棍。第二行是截斷以後,所得到的各節木棍的長度。在最後一組資料之後,是乙個零。

輸出

為每組資料,分別輸出原始木棒的可能最小長度,每組資料佔一行。

樣例輸入

9

5 2 1 5 2 1 5 2 1

41 2 3 4

0

樣例輸出

6

5

#include #include #include using namespace  std;

bool isend=false;

int len=1;

vectora(64);

vectorvisit(64);

int num;

//used_num為當前已被用過的小棒數,now_index為當前要處理的小棒。

void dfs(int used_num,int now_len,int now_index)

if(now_len==len)else

return;

}if(now_len==0)else

int main()

isend=false;

int sum=0;

int max=0;

for(int i=0;i>a[i];

sum+=a[i];

if(a[i]>max)

}sort(a.begin(),a.end(),cmp);

for(len=max;len問題描述:給出4個1-10的數字,通過加減乘除,得到數字為24就算勝利

輸入:4個1-10的數字。[數字允許重複,但每個數字僅允許使用一次,測試用例保證無異常數字]

輸出:true or false

輸入4個int整數

返回能否得到24點,能輸出true,不能輸出false

示例1複製

7 2 1 10
複製

true
#include#include#include #include using namespace std;

int dfs(vectornum,vectorflag,int sum)

for(int i=0;i<4;i++)

if(dfs(num,flag,sum-num[i])==1)

if(dfs(num,flag,sum*num[i])==1)

if(num[i]!=0&&dfs(num,flag,sum/num[i])==1&& sum % num[i]==0)

flag[i]=0;}}

return 0;

}int main()

return 0;

}

307 Sticks( )經典DFS 剪枝

題意 長度相同的木棒被分成許多段,求木棒原來狀態的最短長度 此題重在剪枝,主要剪枝思路有 使用陣列a儲存被分解成的各個部分的長度,木棒的每段被稱之為s 搜尋範圍從max到sum,且必須能被sum整除 為避免重複,組合成木棒的s從大到小排序,每根木棒的第乙個s,也要求從大到小排序 在某層搜尋中,如果a...

搜尋剪枝DFS

tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...

DFS搜尋 剪枝

hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...