| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:贴0ms的AC代码。好几天才过In Reply To:贴0ms的AC代码。好几天才过 Posted by:pbgg at 2010-10-26 15:59:34 赞剪枝!!!
> #include <iostream>
> #include <algorithm>
> #include <functional>
> using namespace std;
> int n;
> int stick[70];
> int used[70];
> int num;
> int length;
> int quick[70];
> bool dfs(int left,int i,int total)
> {
> if (total == num)
> {
> return true;
> }
> for (int j = i; j <= n;j++)
> {
> if (left < stick[j] || used[j])
> {
> continue;
> }
> else if(left == stick[j])
> {
> used[j] = true;
> if (dfs(length, 1, total + 1))
> {
> return true;
> }
> else
> {
> used[j] = false;
> break;
> }
> }
> else
> {
> used[j] = true;
> if ( j + 1 <= n && dfs(left - stick[j], j + 1, total))
> {
> return true;
> }
> else
> {
> used[j] = false;
> if (left == length || j == n)
> {
> return false;//在搜索一根全新的小棒不成功,那么停止搜索,剪枝//当j = n时候也停止搜索
> }
> j = quick[j] - 1 ;//同样长的小棒不再同样搜索,掠过,剪枝,后面有j++,所以需要减一
> }
> }
> }
> return false;
> }
> int main()
> {
> while (scanf("%d",&n) && n != 0)
> {
> int longest = 0,sum = 0;
> memset(stick,0,sizeof(stick));
> for (int i = 1; i <= n; i++)
> {
> scanf("%d",&stick[i]);
> sum += stick[i];
> if (stick[i] > longest)
> {
> longest = stick[i];
> }
> }
> sort(stick + 1,stick + 1 + n,greater<int>());
>
> {
> int began = 1;
> int temp = stick[n];stick[n] = -1;
> for (int i = 1; i < n ;i++)
> {
> if (stick[i] > stick[i + 1])
> {
> for ( int j = began; j <= i; j++)
> {
> quick[j] = i + 1;
> }
> began = i + 1;
> }
> }
> stick[n] = temp;
> }
> for (int i = longest; i <= sum; i++)
> {
> if (sum % i == 0)
> {
> memset(used,false,sizeof(used));
> num = sum / i;length = i;
> if (dfs(length,1,0))
> {
> cout<<i<<endl;
> break;
> }
> }
> }
> }
> return 0;
> }
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator