ACM PKU 1011 Sticks 深度优先搜索

以下是lowai的程序,牛啊,学习中。

#include <stdio.h> 
#include 
<stdlib.h>  //due to:qsort
#include <string.h>  

int n; 
int stick[100]; 
int total; 
int ns;            //一共需要还原出的木棍数ns
int ok;            
int len;           //当次需要达到的长度

int cmp(const void *a,const void *b) 
   
int a1 = *(int *)a; 
   
int a2 = *(int *)b; 
   
return a2 - a1; 
}
 
int used[100]; 

int adds() 
   
int j = 0
   
for (int i = 1;i <= n;i++
      j 
+= stick[i]; 
   
return j; 
}
 

void search(int,int,int); 

void s(int x) {         //x 正在还原第x根木棍
   if (x > ns) 
      ok 
= 1
      printf(
"%d\n", len); 
      
return
   }
 

   
int i; 
   
for (i = 1;i <= n;i++
      
if (!used[i]) break;  //找到第一根没有使用的木棍

   used[i] 
= 1;           //改变它的使用状态
   search(x,stick[i],i);         //搜索
   used[i] = 0;                   //还原它的使用状态
}
 

void search(int num,int now,int next) {   //num正在还原第num根木棍

   
if (ok) return
   
if (now == len) {   //一根木棍还原完
       s(num + 1);    //还原下一根
    return
   }
 

   
if (next + 1 > n) return;   //总共只有n根短棍

   
for (int i = next + 1;i <= n;i++
      
if (!used[i]) 
          
if(stick[i] + now <= len) {   //该木棍加上当前长度小于len
         used[i] = 1;                    
         search(num,now 
+ stick[i],i);   //搜索
         used[i] = 0
         
if (ok) return
         
if (stick[i] == len - now) return;  //有一根木棍长度正好等于当前差值
       }
 
}
 

int main () 
   
while (scanf("%d"&n) == 1{               
       
if (!n) break;                            //读数据
       ok = 0
        
    
int i; 
    
for (i = 1;i <= n;i++) scanf("%d"&stick[i]); 
    qsort(stick
+1,n,sizeof(int),cmp);              //快速排序,从大到小
    total = adds();                                //计算木棍总长度
    for (i = stick[1];i <= total;i++)             //从最大的木棍 到 总长度 ,依次枚举 
        if (total % i == 0 && !ok) {              //如果该长度可以被总长度整除,且还没有ok
            ns = total / i;                       //求出一共需要还原出的木棍数ns
            memset(used,0,sizeof(used));          //所有木棍使用状态清零
            len = i;                              //当次需要达到的长度
            s(1);  
        }
 
   }
 
   
return 0
}
 

另外,stdlib.h中的qsort还是挺好用的,呵呵

posted on 2007-09-18 03:08 流牛ζ木马 阅读(3797) 评论(2)  编辑 收藏 引用

评论

# re: ACM PKU 1011 Sticks 深度优先搜索 2009-02-17 20:50 pandy

额。。。。看不懂哎。  回复  更多评论   

# re: ACM PKU 1011 Sticks 深度优先搜索 2009-07-27 17:35 筱驀釹

看了你的解题程序,对我帮助挺大的,不过文字性的类容少了点
总之非常谢谢你哈!!!!!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

公告

MY Email/MSN :mars1021@163.com QQ : 27402040 流牛ζ木马

常用链接

留言簿(6)

随笔档案

相册

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜