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