赞
踩
所有路径都由两条路径构成: 一条从 v i v_i vi到 v k v_k vk的路径,路径中每个中间顶点的编号都不大于 k − 1 k-1 k−1; 一条从 v k v_k vk到 v j v_j vj的路径,路径中每个中间顶点的编号也都不大于 k − 1 k-1 k−1
设路径长度为
d
d
d 得到以下递推式,
当
k
≥
1
,
d
i
j
(
0
)
=
w
i
j
时
,
d
i
j
(
k
)
=
m
i
n
{
d
i
j
(
k
−
1
)
,
d
i
k
(
k
−
1
)
+
d
k
j
(
k
−
1
)
}
当k\geq 1, d_{ij}^{(0)}=w_{ij}时, d_{ij}^{(k)} = min
同理路径本身也可以得到与上面相同的公式
初始化邻接矩阵
通过邻接矩阵来初始化路径矩阵
k k k 从 0 开始循环
遍历邻接矩阵,按照公式处理邻接矩阵和路径矩阵
当
k
≥
1
,
d
i
j
(
0
)
=
w
i
j
时
,
d
i
j
(
k
)
=
m
i
n
{
d
i
j
(
k
−
1
)
,
d
i
k
(
k
−
1
)
+
d
k
j
(
k
−
1
)
}
当k\geq 1, d_{ij}^{(0)}=w_{ij}时, d_{ij}^{(k)} = min
将两个矩阵返回,即得到最短路径的长度以及最短路径本身
import numpy as np # 初始化邻接矩阵 W = [ [0, np.inf, 3, np.inf, np.inf], [2, 0, np.inf, np.inf, 5], [np.inf, 7, 0, 1, np.inf], [6, np.inf, np.inf, 0, 11], [np.inf, np.inf, np.inf, np.inf, np.inf], ] S = [] # 初始化路径矩阵 for i in range(len(W)): S.append([chr(97 + i) for j in range(len(W))]) def Floyd(W, S): D = W for k in range(len(W)): for i in range(len(W)): for j in range(len(W)): if D[i][j] > D[i][k] + D[k][j]: S[i][j] = S[i][k] + S[k][j] D[i][j] = D[i][k] + D[k][j] # 给路径矩阵添上路径终点结点 if k == len(W) - 1: S[i][j] += S[j][0][0] return np.array(D), np. array(S) W, S = Floyd(W, S) print("3190608027 黄文焕") print(W) print(S)
输入 n 以及从大到小排列的币值
循环处理 li 中的币值,n / li[index],n = n % li[index]
将结果保存在字典 d 中,
返回结果字典 d
print("3190608027 黄文焕")
n = int(input("请输入n: "))
li = list(map(int, input("请从大到小输入币值: ").split()))
d = dict()
index = 0
while index < len(li):
m = int(n / li[index])
d[li[index]] = m
n = n % li[index]
index += 1
print(d)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。