DFS+剪枝 先把数据降序排序,从最大的木枝长度开始搜,这样比较省时间。 注意剪枝: 1。 不能整除的数,剪掉; 2。 之前试过的数如果不合适,那么接下来相同的数都应该跳过。 #include<iostream> #include<algorithm> using namespace std; int s[65]; bool mark[65]; int len, sum, num, n; bool cmp( int l, int r ) { return l > r; } bool dfs( int temp, int k, int cnt ) { if( cnt == num ) { return true; } else if( temp == len ) { return dfs( 0, 0, cnt+1 ); } else { int pre = 0; int j; for( j=k; j<n; j++ ) { if( !mark[j] && temp+s[j]<=len && s[j]!=pre ) { pre = s[j]; mark[j] = 1; if( dfs( temp+s[j], j+1, cnt ) ) { break; } mark[j] = 0; if( k == 0 ) return false; } } if( j == n ) return false; else return true; } } int main() { while( cin>>n, n ) { sum = 0; int i,j; for( i=0; i<n; i++ ) { cin>>s[i]; sum += s[i]; } sort( s, s+n, cmp ); for( j=s[0]; j<sum/2; j++ ) { if( sum % j == 0 ) { len = j; num = sum / j; memset( mark, 0, sizeof(mark) ); if( dfs( 0,0,0 ) ) { break; } } } cout<<j<<endl; } return 0; }