题意:
给出你n个小木棒,要求还原成多个长度相同的完整木棒,并求出符合要求的最短的木棒的长度。
经典搜索题。
分析:
这样的题不确定因素很多,所以只能遍历定一个条件,根据这一条件去遍历确定另一条件。另外这题还要剪枝才行,不然会超时。
poj1011
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 100
#define inf 0x7fffffff
#define mod 1000000007
int a[maxn];
int vis[maxn];
int n;
bool dfs(int len,int remain,int level)// 需要组成合适的长度还需要的长度 剩下的长度 当前已经完成几根了
{
if(remain==0 )
{
remain=len;level--;
if(level==0)return true;
}
int i,j;
for(i=0;i<n;i++)
{
if(!vis[i] && a[i]<=remain)
{
vis[i]=1;
if(dfs(len,remain-a[i],level))return true;
vis[i]=0;
if(remain==a[i] || remain==len)break;
while(a[i]==a[i+1] )i++;
}
}
return 0;
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
while(~scanf("%d",&n))
{
int i,j,sum=0,mmax=-1;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n,cmp);
// memset(vis,0,sizeof(vis));
// cout<<" 99999 "<<dfs(sum,sum,1 )<<endl;
for(i=a[0];i<=sum;i++)
{
if(sum%i==0)
{
memset(vis,0,sizeof(vis));
if(dfs(i,i,sum/i))
{
cout<<i<<endl;
break;
}
}
}
}
}