比酒量问题与二叉树搜索和路径问题

来源:互联网 发布:数据库维护需要什么 编辑:程序博客网 时间:2024/05/17 02:21

比酒量问题:

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。


等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

如果有多个可能的答案,请列出所有答案,每个答案占一行。


刚开始我的想法是这样的:

构造20棵树,树根的值分别是1,2,.......,20.然后搜索路径使得路径上的和是20!。但是我发现这样是行不通的,因为20!已经溢出,不管是long还是int。而且最后我发现我小题大作了。因为这道题无非就是一个多项式穷举的问题,就是利用穷举法求方程1/a+1/b+1/c+1/d = 1的所有解。直接通分一下,也就是bcd+acd+abd+abc=abcd。其中20>=a>=b>=c>=d>=1.所以这道题归根结底是一道数学题而不是编程题。用四个for循环便可以求得其解:


#include<iostream>
using namespace std;


int maxN = 20;
int a;
int b;
int c;
int d;
int count = 0;


int main(){
for(a=1;a<=maxN;a++){
for(b=1;b<=a;b++){
for(c=1;c<=b;c++){
for(d=1;d<=c;d++){
count++;
if(b*c*d+a*c*d+a*b*c+a*b*d== a*b*c*d)
cout<<a<<"\t"<<b<<"\t"<<c<<"\t"<<d<<endl;
}
}
}
}
cout<<endl<<count<<endl;
}


====================================================================

在这也贴一段用递归寻找特定和的二叉树路径的算法,自己写的:

int sum(int count,int* x){
int tmp = 0;
for(int i=0;i<=count;i++){
tmp += x[i];
}
return tmp;
}


bool Place(int count,int* x,int des,BinaryTreeNode* t){
if(t->m_nValue + sum(count,x) > des)
return false;
return true;
}


void FindPath(int count,int* x,int des,BinaryTreeNode* t){
if(Place(count,x,des,t)){
count++;
x[count] = t->m_nValue;
if(t->m_pLeft == NULL && t->m_pRight == NULL){
if(sum(count,x) == des){
for(int i=0;i<=count;i++)
cout<<x[i]<<" ";
cout<<endl;
}
}else{
if(t->m_pLeft != NULL)
FindPath(count,x,des,t->m_pLeft);
if(t->m_pRight != NULL)
FindPath(count,x,des,t->m_pRight);
}
}
}




原创粉丝点击