POJ1011

来源:互联网 发布:js attr style 编辑:程序博客网 时间:2024/06/05 15:34
//小木棒问题经典搜索(剪枝)//将木棒按照降序排序//从最大的单根木棒长度开始搜索,一直搜索到所有木棒长度的总和,判断这种长度能否实现#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std;int stick[70];int sum , len , num , many;bool visit[70] ;//记录当前木棒是否被使用bool comp(int a , int b){    return a > b ;}bool DFS(int n , int l , int p)//n是当前拼好了几根木棒;l代表当前在拼的这根木棒长;p为在木棒数组里搜索到的当前下标{    if(n == many) return true ;    for(int i = p + 1 ;i < num ; i ++)    {        if(visit[i]) continue ;        if(l + stick[i] == len)        {            visit[i] = true ;            if(DFS(n + 1 , 0 , -1)) return true ;            visit[i] = false ;            return false ;        }        else if(l + stick[i] < len)        {            visit[i] = true ;            if(DFS(n , l + stick[i] , i)) return true ;            visit[i] = false ;            if(l == 0) return false ;            while(stick[i] == stick[i+1]) i++;//如果当前的长度搜索失败, 那么和该长度相等的长度也会搜索失败        }    }    return false ;}int main(){    while(scanf("%d",&num)!=EOF,num)    {        sum = 0 ;        for(int i = 0 ; i < num ; i ++)        {            scanf("%d",&stick[i]) ;            sum += stick[i] ;        }        sort(stick , stick + num , comp) ;        for(len = stick[0] ; len <= sum ; len ++)        {            if(sum % len == 0)            {                many = sum / len ;                memset(visit , false , sizeof(visit)) ;                if(DFS(1,0,-1))                {                    printf("%d\n",len);                    break ;                }            }        }    }    return 0 ;}

0 0
原创粉丝点击