hdu 1455 sticks

来源:互联网 发布:淘宝怎么找货到付款 编辑:程序博客网 时间:2024/05/20 00:52

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1455

题目大意是给你一堆木棍,然后让他们互相之间随意拼接,组成任意多个相同长度的 新木棍,要求新木棍们的长度最短

一道dfs,但是似乎要剪枝,我一开始也没有想到好的方法= =

最后网上看了题解以后跟着做的...

stick数组表示当前木棍的长度,然后used数组表示已经用来拼接过的木棍

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <string>using namespace std;int flag;int n;int len,num;int stick[100],used[100];bool cmp(int a,int b){    return a>b;}void dfs(int pos,int cur,int cnt){    if(flag)        return ;    if(cur==len)    {        cnt++;        if(cnt==num)        {            flag=1;            return ;        }        dfs(0,0,cnt);        return;    }    if(pos==n)        return; //已搜索整个数组    int pre=-1;    for(int i=pos;i<n;i++)    {        //第i根stick没有用过;之前没有与他等长的stick失效,现有长度加上sticks[i]不大于理论长度        if(!used[i]&&pre!=stick[i]&&cur+stick[i]<=len)        {            pre=stick[i];            used[i]=1;            dfs(i+1,cur+stick[i],cnt);            used[i]=0;            if(flag)//满足条件,返回                return ;            //最长的一根stick[i]要被废弃,则表示至少有一根最长的要被废弃,不合适            if(pos==0)                return;        }    }}int main(){    //freopen("in.txt","r",stdin);    int sum;    while(scanf("%d",&n)!=EOF)    {        if(n==0)            break;        sum=0;        for(int i=0;i<n;i++)        {            scanf("%d",&stick[i]);            sum+=stick[i];        }        sort(stick,stick+n,cmp);        int max=stick[0];        for(len=max;len<=sum;len++)        {            if(len>(sum+1)/2)            {                len=sum;                break;            }            if(sum%len==0)            {                num=sum/len;                memset(used,0,sizeof used);                flag=0;                dfs(0,0,0);                if(flag)                    break;            }        }        printf("%d\n",len);    }    return 0;}



0 0
原创粉丝点击