POJ1011 木棒

来源:互联网 发布:怎样在淘宝网上传宝贝 编辑:程序博客网 时间:2024/05/01 23:15

代码貌似不对,再放放… …

Time Limit: 1000MS Memory Limit: 10000K
Description

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。
Input

输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后,所得到的各节木棍的长度。在最后一组数据之后,是一个零。
Output

为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
Sample Input

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output

6
5
Source

Central Europe 1995

解释:
看下面程序中的注释即可,
特别的,如果a[i]==rest,a[i]已经失败了,所以和它相同的rest长度肯定也会失败。
如果rest==len说明,说明在用a[i]之前没有用过任何木棍,那么以a[i]为第一根的情况失败了,那么这根木棍肯定拼不成目标长度,这个搜索也就没有意义了,直接跳出大循环。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int a[55];bool vis[55];int n; bool cmp(const int a,const int b){    if(a>=b)        return 1;    else         return 0;}/*DFS:递归搜索,以剩下小棒数和拼接一根棒所需长度作为递归参数*/ bool dfs(int len,int num,int rest)//..,剩余的小棒数目 {    if(num==n && rest==0)/*当还需长度为0且未作接接的小棒个数为0时,说明拼接成功*/    return len;        return 1;    if(rest==0)/*当完成拼接一个棒时,要重新进行下一根木棒拼接,给remains_len重新赋值*/        rest=len;    for(int i=0;i<n;i++)    {        if(vis[i]) /*已经作为成功拼接的小棒,不再作为拼接对象*/             continue;        if(rest>=a[i])        {            vis[i]=1;            if(dfs(len,num-1,rest-a[i]))/*当接受这根小棒a[i],能完成所有任务,则返回成功拼接棒长*/                 return 1;             vis[i]=0;             if(a[i]==rest && len==rest)//这一步很重要,看上面的分析                 break;            while(a[i+1]==a[i])/*当a[i]不能完成任务,与它相同的小棒也不能完成任务(剪枝) */                i++;        }    }    return 0;}int main(){    while(scanf("%d",&n) && n)    {        int sum=0;        int len;        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            sum+=a[i];//a[1] a[2] a[3] a[4]         }        sort(a,a+n,cmp);        for(len=a[0];len<=sum;len++)/*每次尝试都要置所有小棒为可用*/        {            memset(vis,0,sizeof vis);            if(sum%len==0)            {                if(dfs(len,n,0))//要拼成len的长度,用过的木棍数数量,剩余长度                 {                    cout<<len<<endl;                    break;                  }               }           }       }    return 0;}
0 0
原创粉丝点击