zoukankan      html  css  js  c++  java
  • hdu 1455 搜索经典

    讲的大致是几根原本长度相同的木棒,然后被某人当出气筒剪啊剪啊,剪成好几段,然后,好吧,这时间一长记性就差了,忘了原来这堆木棒的长度。。。orz,我这若菜,也只能帮您推算出原来这堆木棒的可能的最短长度了。。。

    搜索中的经典之经典,必须掌握啊。。。。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 struct stick{
     7     int length;  //长度
     8     int mark;  //标记是否被使用过
     9 };
    10 stick sticks[64];
    11 int n,num,sum;
    12 
    13 int cmp(const stick &s1,const stick &s2){
    14     return s1.length>s2.length;
    15 }
    16 //len当前的长度,count当前长度为len的木棒的根数
    17 int dfs(int len,int l,int count,int pos){
    18     if(len==sum)return 1;//如果当期的长度就是所有木棒的总长
    19     if(count==num)return 1;
    20     for(int i=pos;i<n;i++){
    21         if(sticks[i].mark)continue;
    22         //没有被标记过的
    23         if(len==(sticks[i].length+l)){
    24             sticks[i].mark=1;
    25             if(dfs(len,0,count+1,0))//长度相等时,还是要从第一根开始搜
    26                 return 1;
    27             sticks[i].mark=0;
    28             return 0;
    29         }else if(len>(sticks[i].length+l)){
    30             sticks[i].mark=1;
    31             l+=sticks[i].length;
    32             if(dfs(len,l,count,i+1))
    33                 return 1;
    34             l-=sticks[i].length;//如果不成功,就要恢复
    35             sticks[i].mark=0;
    36             if(l==0)return 0;//当前搜索,如果前面的l为0,但第一根没有用上,那么这根木棒就要舍弃
    37             while(sticks[i].length==sticks[i+1].length)i++;//这根不成功的话,则相连的长度相同的不要
    38         }
    39     }
    40     return 0;
    41 }
    42 
    43 int main(){
    44     while(scanf("%d",&n)!=EOF){
    45         if(n==0)break;
    46         sum=0;
    47         for(int i=0;i<n;i++){
    48             scanf("%d",&sticks[i].length);
    49             sticks[i].mark=0;
    50             sum+=sticks[i].length;
    51         }
    52         sort(sticks,sticks+n,cmp);
    53         for(int len=sticks[0].length;len<=sum;len++){
    54             if(sum%len)continue; 
    55             num=sum/len; //原来长度为len的木棒的根数
    56             if(dfs(len,0,0,0)){
    57                 printf("%d\n",len);
    58                 break;
    59             }
    60         }
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    ARM里面的APB和AHB
    解决win10点击开始按钮无反应
    keil的51和ARM共存方法
    对于一个液晶而言什么是读状态、读数据、写指令、写数据
    关于VMware中Ubuntu 出现Unknown Display问题解决
    论基于SOA的面向服务架构设计及其应用
    科技小论文2
    软件体系架构的质量属性--论文
    一线架构师实践指南阅读笔记03
    一线架构师阅读指南-阅读感想02
  • 原文地址:https://www.cnblogs.com/wally/p/2880128.html
Copyright © 2011-2022 走看看