import numpy as np import math inf = math.inf def run(sets, num): dp = [-inf]*(num+1) dp[0] = 0 count = list(range(np.size(dp))) del(count[0]) jz = np.zeros((num+1, np.size(sets))) for i in count: dp_f = [] k_f = [] for k in sets: if i >= k: if dp[i-k] != -inf: dp_f.append(dp[i-k]) k_f.append(sets.index(k)) dic_k = dict(zip(dp_f, k_f)) if np.size(dp_f) > 0: dp[i] = min(dp_f)+1 mm = dic_k[min(dp_f)] kk = [0]*np.size(sets) kk[mm] = 1 jz[i][:] = jz[i-sets[mm]][:]+kk # print("指定第", i, "行", "在", i-sets[mm], "行上", mm, "位置", jz[i-sets[mm]][:], "加上1") else: dp[i] = -inf jz[i][:] = [inf]*np.size(sets) # print(dp) # print(jz) return jz if __name__ == "__main__": SETS = [5, 1, 2, 10, 20] NUM = 2325 jz = run(SETS, NUM) print("------------最终结果-------------", jz[NUM])
找零钱问题动态规划
最新推荐文章于 2023-06-01 10:45:53 发布