Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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
Python 在动态规划示例中使用无穷大-为什么这不会失败?_Python_Dynamic Programming - Fatal编程技术网

Python 在动态规划示例中使用无穷大-为什么这不会失败?

Python 在动态规划示例中使用无穷大-为什么这不会失败?,python,dynamic-programming,Python,Dynamic Programming,在本页中,我一直在尝试了解如何使用动态编程 给出N个硬币的列表,它们的值(V1,V2,…,VN)和总和S。找出最小数量的硬币,其总和为S(我们可以使用任意数量的一种类型的硬币),或者报告不可能以这样的方式选择硬币,即它们的总和为S 给定值为1、3和5的硬币。 和S被设置为11 Set Min[i] equal to Infinity for all of i Min[0]=0 For i = 1 to S For j = 0 to N - 1 If (Vj<=i AND Min[

在本页中,我一直在尝试了解如何使用动态编程

给出N个硬币的列表,它们的值(V1,V2,…,VN)和总和S。找出最小数量的硬币,其总和为S(我们可以使用任意数量的一种类型的硬币),或者报告不可能以这样的方式选择硬币,即它们的总和为S

给定值为1、3和5的硬币。 和S被设置为11

Set Min[i] equal to Infinity for all of i
Min[0]=0

For i = 1 to S
For j = 0 to N - 1
   If (Vj<=i AND Min[i-Vj]+1<Min[i])
Then Min[i]=Min[i-Vj]+1

Output Min[S]

将所有i的Min[i]设置为无穷大
最小值[0]=0
对于i=1到S
对于j=0到N-1

如果(Vj这可能是一种直接翻译:

def dp_coin(S, coins):
    # set all values to infinity in range S/sum needed
    mn = [float("inf") for j in range(S+1)]
    # takes 0 coins to sum 0
    mn[0] = 0
    # start at second index 1
    for i in range(1, S+1):
        for j in range(len(coins)):
            if coins[j] <= i and mn[i-coins[j]]+1 < mn[i]:
                mn[i] = mn[i-coins[j]] + 1
    return mn[-1]

print(dp_coin(11, [1, 3, 5]))
3
与下表相同:

Sum Min. nr. of coins   Coin value added to a smaller sum to
obtain this sum (it is displayed in brackets)
0   0   -
1   1   1 (0)
2   2   1 (1)
3   1   3 (0)
4   2   1 (3)
5   1   5 (0)
6   2   3 (3)
7   3   1 (6)
8   2   3 (5)
9   3   1 (8)
10  2   5 (5)
11  3   1 (10)
S
指所需的总金额,
coins[j]
相当于
Vj
N
指的是硬币

可以删除内部循环,只需在硬币上迭代:

def dp_coin(S, coins):
    mn = [float("inf") for j in range(S+1)]
    mn[0] = 0
    for i in range(1, S+1):
        for j in coins:
            if j <= i and mn[i-j]+1 < mn[i]:
                mn[i] = mn[i-j] + 1
    return mn[-1]
def dp_硬币:
mn=[范围(S+1)内j的浮点(“inf”)]
mn[0]=0
对于范围(1,S+1)内的i:
对于硬币中的j:

如果任意一个数小于无穷大,那么从一个默认值开始是一个非常安全的地方,您如何在代码中编写它,即某个值是无限的?我知道它是无限的,但不知道如何避免在这里遇到未定义的错误。您可以使用
float(“inf”)
Set Min[I]对于所有的i来说等于无穷大
你怎么用python来写呢?你确定这是python吗?看起来不是。但是为什么他们要做
+1
?`如果j
i+1
是下一个状态,
N-1
不是
S
,我们需要S+1,因为范围是不包含的
Sum Min. nr. of coins   Coin value added to a smaller sum to
obtain this sum (it is displayed in brackets)
0   0   -
1   1   1 (0)
2   2   1 (1)
3   1   3 (0)
4   2   1 (3)
5   1   5 (0)
6   2   3 (3)
7   3   1 (6)
8   2   3 (5)
9   3   1 (8)
10  2   5 (5)
11  3   1 (10)
def dp_coin(S, coins):
    mn = [float("inf") for j in range(S+1)]
    mn[0] = 0
    for i in range(1, S+1):
        for j in coins:
            if j <= i and mn[i-j]+1 < mn[i]:
                mn[i] = mn[i-j] + 1
    return mn[-1]