找零錢問題 動態規劃 python

2021-09-24 23:15:08 字數 1938 閱讀 8419

問題描述

設有n種不同面值的硬幣,各硬幣的面值存於陣列t[1:n]中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t[1],t[2],…,t[i]時,可找出錢數j的最少硬幣個數記為c(i,j)。若只用這些硬幣面值,找不出錢數j時,記c(i,j)=∞。

«程式設計任務

設計乙個動態規劃演算法,對1≤j≤l,計算出所有的c( n,j )。演算法中只允許實用乙個長度為l的陣列。用l和n作為變數來表示演算法的計算時間複雜性

«資料輸入

從螢幕輸入資料。輸入第1行中有1個正整數n(n<=13),表示有n種硬幣可選。接下來的一行是每種硬幣的面值。由使用者輸入待找錢數j。

«結果輸出

程式執行結束時,將計算出的所需最少硬幣個數輸出到螢幕。

輸入示例

輸出檔案示例3

1 2 593

建立二維動態規劃表

m為該次需要找的錢數,

i為所用錢的種類數,

邊界條件:

1)當找不開時,c[i][m]=∞

2)當m=0時,c[i][m]=0

遞迴關係:

但是要注意找不開的情況,

只有m>=t[i-1]時,才會走:

m程式設計檢驗的時候可以使用

2 3 5

這個例子

def give_coins(t,amount):

maxc=(float('inf'))

lent=len(t)

c=[[maxc for i in range(amount+1)] for k in range(lent+1)]

for i in range(lent+1):

for m in range(amount+1):

if i==0: #初始化第一行

c[i][m]=maxc

elif m==0: #初始化第一列

c[i][m]=0

else:

if m-t[i-1]>=0:

c[i][m]=min(c[i][m-t[i-1]]+1,c[i-1][m])

else:

c[i][m]=c[i-1][m]

return c

#回溯(未成功)

# def back(t,c):

# select=

# lent=len(t)

# import numpy as np

# minc=(np.min(c,axis=0))[-1] #陣列c最後一列的最小值

# minarg=(np.argmin(c,axis=0))[-1] #陣列c最後一列最小值的下標

# while minc>0:

# minc-=t[lent-1]

# minarg-=t[lent-1]

if __name__=="__main__":

n=(int)(input())

#小菜鳥剛學會把n個數輸入到列表中

lista=[int(i) for i in input().split()]

# print(lista)

amount=(int)(input())

result=give_coins(lista,amount)

#動態規劃表

# for list in result:

# print(list)

import numpy as np

minc=(np.min(result,axis=0))[-1] #陣列c最後一列的最小值

print(int(minc))

動態規劃5 找零錢問題

題目 有陣列penny,penny中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim 小於等於1000 代表要找的錢數,求換錢有多少種方法。給定陣列penny及它的大小 小於等於50 同時給定乙個整數aim,請返回有多少種方法可以湊成aim。樣例...

動態規劃 找零錢問題 收藏

view plaincopy to clipboardprint?include using namespace std const int m 1000 const int n 3 int coint n int count m 1 count i 表示湊合數量為i所需最少的錢幣數量,則count...

動態規劃系列(2) 找零錢問題

refer tom在自動售貨機上買了一瓶飲料,售價37美分,他投入了1美元 1美元 100美分 現在自動售貨機需要找錢給他。售貨機中現在只有四種面額的硬幣 1美分 5美分 10美分 25美分,每種硬幣的數量充足。現在要求使用最少數量的硬幣,給tom找錢,求出這個最少數量是多少。自動售賣機需要給tom...