列舉最小長度(從max–>sum),用dfs來判斷,如果能成功就可以,退出即可。
dfs中有好多高深的剪枝!!
先將長度降序排序,便於剪枝。
剪枝:
判斷當前的len時
1).如果在前面已經建造這一根長木棒的一部分的基礎上如果這跟小木棒不能成功,那麼和它長度相同的一定也不成功。
2).如果正好這跟小木棒再放上能夠建成一根長木棒,而且不成功,那麼當前列舉的長木棒len就一定不能成功,return 0;
3).若木棍x是舊一組的最後一根,舊一組拼完後,發現新一組無法完成,就不需要再列舉比木棍x小的木棍了;即當前列舉的長木棒len就一定不能成功,return 0;
#include
#include
#include
#include
#include
using
namespace
std;
int n,a[101],n,sum,maxn;
int f[101];
bool cmp(int x,int y)
bool dfs(int x,int len,int now,int num)//當前列舉的最小長度--現在已經拼完的長度--現在拼完的根數
return0;}
int main()
}sort(a+1,a+n+1,cmp);
for(int i=maxn;i<=sum;i++)
if(sum%i==0)
}return
0;}
P1120 小木棍 資料加強版
喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 50 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。首先在讀入的時候忽略掉長度大於50的木棍 最重要 順便還要記錄一下最短的木...
P1120 小木棍 資料加強版
原題鏈結 不得不說,這題真的是一道深度搜尋毒瘤題qwq,整整坑了我乙個上午。先說一下大體思路 1.讀入資料的同時 注意過濾掉長度大於50的木棍 算出所有小木棍的總和sum,因為至少所有的小木棍會拼成一根長度為sum的超大木棍 2.找出所有小木棍中長度最大的那根max,原始長度len一定大於等於這個m...
P1120 小木棍 資料加強版
一道不錯的剪枝題,用到的剪枝優化比較多,剪枝思路也值得學習 在這裡我只採取了能通過此題的剪枝,似乎還可以繼續優化?剪枝講解在注釋裡 include include include include includeusing namespace std const int maxn 70 inline ...