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

本文通过穷举法探讨了酒量问题的数学解法,详细解释了如何使用四个for循环来求解方程,并提供了算法实现。此外,文章还分享了一个用于查找特定和的二叉树路径的递归算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比酒量问题:

有一群海盗(不多于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);
}
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值