讲的大致是几根原本长度相同的木棒,然后被某人当出气筒剪啊剪啊,剪成好几段,然后,好吧,这时间一长记性就差了,忘了原来这堆木棒的长度。。。orz,我这若菜,也只能帮您推算出原来这堆木棒的可能的最短长度了。。。
搜索中的经典之经典,必须掌握啊。。。。
1 #include2 #include 3 #include 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 (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