小墨在努力!!
吗了个b的。。。。。
Source Code
#include <stdio.h>
#include <algorithm>
using namespace std ;
bool visit[65] ,judge ;
int len[65] ,min_length ,stick_num ,num ,next[65] ;
bool cmp(int a ,int b) {
    return a > b ;
}
void init() {
    judge = false ;
    sort(len ,len + num ,cmp) ;  //从大到小排序
    len[num] = -1 ;
    int pre = len[0] ,start = 0 ;
    for(int i = 0 ;i <= num ;i++) {
        if(len[i] != pre) {
            for(int j = i - 1 ;j >= start ;j--)
                next[j] = i ;
            pre = len[i] ;
            start = i ;
        }
    }
}
bool dfs(int now_root ,int now_length ,int index) {
    if(now_root == stick_num)
        return true ;
    for(int i = index ;i < num ;i++) {
        if(visit[i] == false) {
            visit[i] = true ;
            if(now_length + len[i] < min_length) {
                if(dfs(now_root ,now_length + len[i] ,i + 1) == true)
                    return true ;
            }
            else if(now_length + len[i] == min_length) {
                bool ok = dfs(now_root + 1 ,0 ,0) ;
                visit[i] = false ;
                return ok ;
            }
            visit[i] = false ;
            if(now_length == 0)
                return false ;
            i = next[i] - 1 ;
        }
    }
    return false ;
}
int main() {
    int sum ,i ;
    while(scanf("%d" ,&num) && num != 0) {
        sum = 0 ;
        for(i = 0 ;i < num ;i++) {
            scanf("%d" ,&len[i]) ;
            sum += len[i] ;
        }
        init() ;
        for(min_length = len[0] ;min_length <= sum ;min_length++) {  //搜索合法解
            if(sum % min_length == 0) {
                stick_num = sum / min_length ;
                for(int i = 0 ;i < 64 ;i++)
                    visit[i] = false ;
                judge = dfs(1 ,0 ,0) ;
                if(judge == true){
                    printf("%d\n" ,min_length) ;
                    break ;
                }
            }
        }
    }
    return 0 ;
}
posted on 2012-08-01 20:12  小墨在努力!!  阅读(166)  评论(0编辑  收藏  举报