Python 在动态规划示例中使用无穷大-为什么这不会失败?
在本页中,我一直在尝试了解如何使用动态编程 给出N个硬币的列表,它们的值(V1,V2,…,VN)和总和S。找出最小数量的硬币,其总和为S(我们可以使用任意数量的一种类型的硬币),或者报告不可能以这样的方式选择硬币,即它们的总和为S 给定值为1、3和5的硬币。 和S被设置为11Python 在动态规划示例中使用无穷大-为什么这不会失败?,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[
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
?`如果ji+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]