有N栋建筑物。蜘蛛侠在第k大楼吃晚餐。他知道Xth大楼发生火灾。问题是,在任何时候他都可以准确地向前跳F建筑物或向后跳回B建筑物。他希望能够到达Xth大楼,如果是的话,他想知道到达Xth大楼的最小跳跃次数。
我尝试使用递归来解决这个问题。但我有某种直觉,可以通过其他逻辑来解决。任何人都可以推荐一个吗?
答案 0 :(得分:7)
一旦你掌握了数学算法,解决方案在算法上就很简单了。 您需要实现扩展欧几里德算法以及更多内容。
设M = X - K
,您想检查某些整数M = H F + K B
是否为H, K
。
答案(称为Bezout的身份)是当且仅当M
可以被F
和B
的GCD(最大公约数)整除时,方程才会接受解,我们称之为D
。
假设存在一个解决方案,那么你可以解决
H F + K B = D
。
调用(H,K) = (S_H, S_K)
任何解决方案,找到它使用扩展欧几里德算法。
然后存在无限解(T_H, T_K)
,每个整数L
一个,这些都是形式
T_H = S_H + L B/D
T_K = S_K - L F/D
您对最小值为|T_H| + |T_K|
的解决方案感兴趣,这可以再次在理论上计算,或者通过简单的for循环检查最小值,它是一个分段线性函数,当{{{ 1}}接近+ - 无限。
对于背景数学寻找Bezout的身份,它充满了在线资料。
编辑:这似乎包含您需要的所有内容http://public.csusm.edu/aitken_html/m422/Handout1.pdf