• POJ1011 Sticks


    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 136872   Accepted: 32234

    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

    Translator

    北京大学程序设计实习, Xie Di
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 int st[100],num;//个数 
     8 bool vis[100];
     9 int n,sum;
    10 int len;
    11 int cmp(const int a,const int b){return a>b;}
    12 bool dfs(int s,int now,int p){
    13 //目前在组装第s根棍子,这根棍子已经组装了now长度,从所有短木棍中的第p+1个开始枚举 
    14     bool flag=false;
    15     if(now==0)flag=1;
    16     if(s==num)return true;//拼够数量了 
    17     for(int i=p+1;i<=n;i++){
    18         if(vis[i])continue;
    19         if(now+st[i]==len){
    20             vis[i]=1;
    21             if(dfs(s+1,0,0))return true;//开始拼下一根 
    22             vis[i]=0;//先还原 
    23             return false;//再返回 
    24         }
    25         else if(now+st[i]<len){
    26             vis[i]=1;
    27             if(dfs(s,now+st[i],i))return true;//尝试继续拼这一根 
    28             vis[i]=0;
    29             if(flag)return false;
    30             //开始拼一根木棍时,如果用剩下最长的木棍开始搜不能成功,用比它更短的搜也没有意义,所以跳出 
    31             while(st[i]==st[i+1])i++;//不再尝试相同长度的 
    32         }
    33     }
    34     return false;
    35 }
    36 int main(){
    37     while(scanf("%d",&n)!=EOF && n){
    38         sum=0;
    39         int i,j;
    40         for(i=1;i<=n;i++){
    41             scanf("%d",&st[i]);
    42             sum+=st[i];
    43         }
    44         sort(st+1,st+n+1,cmp);//从大到小排序,开始枚举 
    45         for(i=st[1];i<=sum;i++){//枚举长度 
    46             if(sum%i!=0)continue;//只有能整除,才尝试按这个长度拼 
    47             num=sum/i;//预计拼的个数 
    48             len=i;
    49             memset(vis,0,sizeof vis);
    50             if(dfs(1,0,0)){
    51                 printf("%d
    ",i);//成功就输出 
    52                 break;
    53             }
    54         }
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    下拉复选框
    tp mysql 去重
    前端面试准备2----Javascript中的Undefined和null小结
    前端面试准备1----JS中eval()解析和为什么不要使用eval
    点击一个按钮触发文件选择
    解决JS在url中传递参数时参数包含中文乱码的问题
    asp.net文件/大文件上传需要配置的项目整理
    网页元素位置、鼠标事件位置信息小结
    DOM事件总结
    学习require.js中的一些总结
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5668180.html
Copyright © 2020-2023  润新知