Algorithm 赢得青蛙赛跑
我遇到这个问题,想不出解决办法。有青蛙赛跑,青蛙有一定数量的有效跳跃步数。它可以向前或向后移动。为了赢得比赛,青蛙必须尽可能靠近终点线,但不能越过终点线 例如。Algorithm 赢得青蛙赛跑,algorithm,dynamic-programming,knapsack-problem,Algorithm,Dynamic Programming,Knapsack Problem,我遇到这个问题,想不出解决办法。有青蛙赛跑,青蛙有一定数量的有效跳跃步数。它可以向前或向后移动。为了赢得比赛,青蛙必须尽可能靠近终点线,但不能越过终点线 例如。 6,17 因此,终点线距离6单位,青蛙可以前后跳跃1和7单位。在这里,输出应该是6,因为最佳策略是向后移动1单元,然后向前移动7步到达终点线 考虑到每一次3种情况,你都可以贪婪地吃这个列表:后退、前进或空转。对于优化,我使用了一个已经遇到的值的字典,并为每个迭代添加了最后一步 def knapsack (step_list):
6,17
因此,终点线距离
6
单位,青蛙可以前后跳跃1
和7
单位。在这里,输出应该是6
,因为最佳策略是向后移动1
单元,然后向前移动7
步到达终点线 考虑到每一次3种情况,你都可以贪婪地吃这个列表:后退、前进或空转。对于优化,我使用了一个已经遇到的值的字典,并为每个迭代添加了最后一步
def knapsack (step_list):
for s in step_list :
knap_dict[s] = [s]
knap_dict[-s] = [-s]
knap_dict[0] = []
for key in knap_dict.copy():
path_length = key-s
if path_length == max_step:
return knap_dict[key] + [-s]
if not knap_dict.has_key (path_length):
knap_dict[path_length] = knap_dict[key] + [-s]
path_length = key+s
if path_length == max_step:
return knap_dict[key] + [s]
if not knap_dict.has_key (path_length):
knap_dict[path_length] = knap_dict[key] + [s]
max_step = 10
knap_dict = { 0:[] }
print (knapsack ([1,3,1,6]))
由于每次迭代可能会将关键点的数量增加一倍,这仍然是O(2^n),但我想不出任何更好的实现,除非这个问题可以在数学上简化。您可以达到的位置都是gcd(有效跳跃步数)的整数倍。如果答案只是壁橱可到达的位置,则在终点线前或终点线处取倍数
如果你还需要这些步骤,可以使用扩展的欧几里德算法来计算一个组合。你需要取最后一个方程(
x=x_0+(b/d)*t
;y=y_0-(a/d)*t
)并计算min(t
)
。跳数并不重要?@Henry Oh,也许是这样。我看到了“种族”这个词并推断。。。