赢得青蛙种族

时间:2016-01-02 07:04:05

标签: algorithm dynamic-programming knapsack-problem

我遇到了这个问题,无法提出解决方案。有一个青蛙种族,青蛙有一定数量的有效跳跃。它可以向前或向后移动。为了赢得比赛,青蛙必须尽可能靠近终点线移动,但不能越过它。

实施例。 6, 1 7

因此,终点线距离6个单位,青蛙可以向后和向前跳跃17个单位。在这里,输出应为6,因为最佳策略是向后1单位,然后7向前走到终点线。

2 个答案:

答案 0 :(得分:1)

你可以达到的位置都是gcd的有效倍数(有效的跳跃)。如果答案只是壁橱可到达的位置,则在前一天或终点线处取多个。

如果您还需要这些步骤,可以使用扩展的欧几里德算法来计算组合。

答案 1 :(得分:0)

你可以贪婪的方式吃这份名单,每次考虑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)但我想不出任何更好的实现,除非这个问题可以在数学上简化。

相关问题