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 ; }
快别扯淡了,我什么都不想听