uva 307 bfs优化剪枝

来源:互联网 发布:同济大学软件学院电话 编辑:程序博客网 时间:2024/06/09 18:10

题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短

#include <bits/stdc++.h>using namespace std;#define LL long long#define LD long double#define SC(t,x) static_cast<t>(x)#define AR(t) vector < t >#define PII pair < int, int >#define PLL pair < LL, LL >#define PIL pair < int, LL >#define PLI pair < LL, int >#define PQ priority_queue#define GT(type) greater < type >#define MP make_pair#define PB push_back#define PF push_front#define POB pop_back#define POF pop_front#define PRF first#define PRS second#define fr(x) freopen(x,"r",stdin)#define fw(x) freopen(x,"w",stdout)#define INIT(ar,val) memset ( ar, val, sizeof ( ar ) )#define FORD(loop,start,end) for( int loop = start; loop < end; ++loop )#define FFORD(loop,start,end) for( int loop = start; loop > end; --loop )#define FOR(loop,start,end) for( int loop = start; loop <= end; ++loop )#define FFOR(loop,start,end) for( int loop = start; loop >= end; --loop )#define qmax(a,b) (((a)>(b))?(a):(b))#define qmin(a,b) (((a)<(b))?(a):(b))#define qabs(a) (((a)>=0)?(a):(-(a)))const int INF = 0x3fffffff;const int SINF = 0x7fffffff;const long long LINF = 0x3fffffffffffffff;const long long SLINF = 0x7fffffffffffffff;using namespace std;const int maxn=100;int n,ans,sum;int a[maxn],vis[maxn];bool cmp(int a,int b) {return a>b;}int f1(int x) {    if(sum % x == 0 && (sum / x) >= a[0]) return 1;    return 0;}bool dfs(int cnt,int pos,int sum) {    if(cnt == n)   return true;    for(int i = pos; i < n; i++) {        if(vis[i]) continue;        if(sum + a[i] < ans) {            vis[i] = 1;            if (dfs(cnt + 1, i + 1, sum + a[i]))                return true;            vis[i] = 0;        }         else if (sum + a[i] == ans) {            vis[i] = 1;            if (dfs(cnt + 1, 0, 0))                return true;            vis[i] = 0;            return false;        }        if (sum == 0)            return false;    }    return false;}int main() {//  fr("input.txt");    while(~scanf("%d", &n)) {        if(n==0) break;        memset(a,0,sizeof(a));        sum=0;        for(int i = 0; i < n; i++) {            scanf("%d",&a[i]);            sum+=a[i];        }        sort(a,a+n,cmp);        for(int i=n;i>0;--i) {            if(!f1(i)) continue;            ans=sum/i;            memset(vis,0,sizeof(vis));            if(dfs(0,0,0)) {                printf("%d\n",ans);                break;            }           }    }    return 0;}
原创粉丝点击