#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
bool cmp(int a,int b)
{
return a > b;
}
int map[70];
int a[70];
int n,sum,m,flag;
bool dfs(int s, int len, int x, int sum, int num)
{
//printf("%d %d\n",s1,s2);
if(s == num)
return true;
for(int i = x + 1; i <= n; i++)
{
if(map[i] == 0)
{
if(len + a[i] == sum)
{
map[i] = 1;
if(dfs(s+1, 0, 0, sum, num))
return true;
map[i] = 0;
return false;//剪枝
}
else if(len + a[i] < sum)
{
map[i] = 1;
if(dfs(s, len+a[i], i, sum, num))
return true;
map[i] = 0;
if(len == 0)
return false;//剪枝
while(a[i] == a[i+1])//剪枝
i++;
}
}
}
return false;
}
int main()
{
int i,j,t;
while(scanf("%d",&n), n)
{
flag = 0;
sum = 0;
for(i = 1;i <= n; i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
sort(a+1,a+n+1,cmp);//剪枝
//dfs(0,0,0,8);
for(i = a[1];i <= sum; i++)//剪枝
{
if(sum % i == 0)//剪枝
{
memset(map, 0, sizeof(map));
if(dfs(1, 0, 0, i, sum/i))
{
printf("%d\n", i);
break;
}
}
}
}
}
http://www.cnblogs.com/mycapple/archive/2012/08/14/2638430.html
POJ 1011 Sticks DFS+剪枝
最新推荐文章于 2021-02-18 11:21:18 发布