Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 赢得青蛙赛跑_Algorithm_Dynamic Programming_Knapsack Problem - Fatal编程技术网

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,也许是这样。我看到了“种族”这个词并推断。。。