[搜索]poj1011

来源:互联网 发布:mysql系统表 编辑:程序博客网 时间:2024/06/01 13:08

题意:
给出你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 1000000007int 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;     }    }   }  }} 
0 0