HDU 1455 Sticks

来源:互联网 发布:mac 室内设计软件 编辑:程序博客网 时间:2024/05/20 04:27

大意:给出T根棍子,让你把他们拼成几根相同长度的棍子,问棍子数最多的时候长度是多少(棍子长度最短的时候长度是多少)。
这题跟HDU1518的做法差不多。那题是固定只有4边,这题只不过变成根数是改变的而已。依旧DFS解决。

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;bool flag[65];int a[65],n,t;bool comp(int a,int b){    return a>b;}bool DFS(int l,int j,int len,int count1)//l代表组合棍子的长,j代表下一个棍子起始位置,len代表该种情况下一根组合棍的长度,count1表示组合了多少根。{    if(l == len)    {        l = 0;        j = 0;        count1++;        if(count1 == n)            return true;    }    for(int i = j ; i < t ; i ++)    {        if(!flag[i])        {            flag[i] = true;            if(l+a[i] <= len)            {                bool boom = DFS(l+a[i],i+1,len,count1);                if(boom&&!flag[0]) return false;                else if(boom) return true;            }            flag[i] = false;            while(a[i] == a[i+1]) i++;        }    }    return false;}int main(){    int maxlen,minlen,ans = 0;    while(~scanf("%d",&t)&t)    {        maxlen = minlen = 0;        memset(flag,false,sizeof(flag));        for(int i = 0 ; i < t ; i ++)        {            scanf("%d",&a[i]);            minlen = max (minlen , a[i]);            maxlen += a[i];        }        sort(a,a+t,comp);//对棍子长度排个序。        for(int i = minlen ; i <= maxlen ; i++)        {//枚举棍子长度。            if(maxlen % i == 0)            {                n = maxlen / i;//根数                ans = i;//长度。                if(DFS(0,0,i,0))                {                    break;//找到最短的停止。                }            }        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击