喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。
現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。
給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。
共二行。
第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中n≤65n≤65
(管理員注:要把超過5050的長度自覺過濾掉,坑了很多人了!)
第二行為nn個用空個隔開的正整數,表示nn根小木棍的長度。
乙個數,表示要求的原始木棍的最小可能長度
輸入 #1複製
9輸出 #1複製5 2 1 5 2 1 5 2 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的木棍 最重要 順便還要記錄一下最短的木...