9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
6 5
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std ;
int n , d[70] , t;
bool visited[70] , notPrime[65*55];
bool cmp(const int a , const int b)
{
return a>b ;
}
bool dfs(int len , int sum , int c , int pos)
{
if(c == t)
{
return true ;
}
else if(len == sum)
{
if(dfs(len,0,c+1,0))
{
return true ;
}
}
else
{
for(int i = pos ; i < n ; ++i)
{
if(!visited[i])
{
if(sum+d[i]>len)
{
continue ;
}
visited[i] = true ;
if(dfs(len,sum+d[i],c,i+1))
{
return true ;
}
visited[i] = false ;
//这一步剪枝很重要 ,没有可能超时
if(sum == 0)
{
return false ;
}
//如果下一个 长度与当前相等,那无需再次重复搜索
while(d[i] == d[i+1]) ++i ;
}
}
}
return false ;
}
int main()
{
while(~scanf("%d",&n) && n)
{
int sum = 0 ;
for(int i = 0 ; i < n ; ++i)
{
scanf("%d",&d[i]) ;
sum += d[i] ;
}
bool flag = false ;
sort(d,d+n,cmp) ;
for(int i = d[0]; i <= sum/2 ; ++i)
{
if(sum%i == 0) //剪枝,当且仅当sum能整除i时,才有可能
{
t = sum/i ;
memset(visited,false,sizeof(visited)) ;
if(dfs(i,0,1,0))
{
printf("%d\n",i) ;
flag = true ;
break ;
}
}
}
if(!flag)
{
printf("%d\n",sum) ;
}
}
return 0 ;
}
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std ;
int n , d[70] ;
bool visited[70] , notPrime[65*55];
bool cmp(const int a , const int b)
{
return a>b ;
}
bool dfs(int len , int sum , int c , int pos)
{
if(c == n)
{
return true ;
}
else if(len == sum)
{
if(dfs(len,0,c,0))
{
return true ;
}
}
else
{
for(int i = pos ; i < n ; ++i)
{
if(!visited[i])
{
if(sum+d[i]>len)
{
continue ;
}
visited[i] = true ;
if(dfs(len,sum+d[i],c+1,i+1))
{
return true ;
}
visited[i] = false ;
//这一步剪枝很重要 ,没有可能超时
if(sum == 0)
{
return false ;
}
//如果下一个 长度与当前相等,那无需再次重复搜索
while(d[i] == d[i+1]) ++i ;
}
}
}
return false ;
}
int main()
{
while(~scanf("%d",&n) && n)
{
int sum = 0 ;
for(int i = 0 ; i < n ; ++i)
{
scanf("%d",&d[i]) ;
sum += d[i] ;
}
bool flag = false ;
sort(d,d+n,cmp) ;
for(int i = d[0]; i <= sum/2 ; ++i)
{
if(sum%i == 0) //剪枝,当且仅当sum能整除i时,才有可能
{
memset(visited,false,sizeof(visited)) ;
if(dfs(i,0,1,0))
{
printf("%d\n",i) ;
flag = true ;
break ;
}
}
}
if(!flag)
{
printf("%d\n",sum) ;
}
}
return 0 ;
}
hdu 1455 Sticks DFS 又是一个花样剪枝 ,累觉不爱
原文地址:http://blog.csdn.net/lionel_d/article/details/44487101