搜尋 P1120 小木棍

2021-09-25 22:19:30 字數 921 閱讀 2089

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

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

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

共二行。

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

(管理員注:要把超過5050的長度自覺過濾掉,坑了很多人了!)

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

乙個數,表示要求的原始木棍的最小可能長度

輸入 #1複製

9

5 2 1 5 2 1 5 2 1

輸出 #1複製

6
思路:深搜的剪枝,關鍵是要怎麼剪枝,容易tle.關於怎麼剪枝都寫在了**裡面

**:

#includeusing namespace std;

int n,a[105],book[105];

int cnt=0,t,fla=0;

int maxx=-1,minn=1e9,sum=0;

bool cmp(int x,int y)

//num為已拼當前木棒長度,s為目前要驗證的是否可行的木棒長度

//summ為已拼所有木棒的長度,mark為上一根所取木棒的標號,用於剪枝

//k為已拼好的木棒根數

void dfs(int num,int s,int summ,int mark,int k)}}

else//最新拼了一根}}

}int main()

sort(a+1,a+1+cnt,cmp);

for(int i = maxx; i <= sum;i++)}}

}

P1120 小木棍 資料加強版 (搜尋 剪枝)

原題 題意 有n 65 根小木棍,長度a ia i ai 50 這些小木棍是由x根l長木棍切割而得,現在x和l不確定,讓你求最小的l。題目說了如果出現大於50的木棍要忽略。解析 首先當然是要列舉長度l了,下界為給出長度最大值mama ma,上界為所有木棍長度和sum sumsu m。當然sum su...

P1120 小木棍 資料加強版 (搜尋剪枝)

include using namespace std const int maxn 70 const int maxv 3260 int it num 0 int s,n,l maxn bool vis maxn s maxn maxv bool cmp int lhs,int rhs bool ...

P1120 小木棍 資料加強版

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 50 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。首先在讀入的時候忽略掉長度大於50的木棍 最重要 順便還要記錄一下最短的木...