問題描述
設有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...