1. 程式人生 > >關於動態規劃的一點研究

關於動態規劃的一點研究

在一起 inpu 為什麽 就會 包含 情況下 關於 bsp 一道

這幾天在牛客網上玩耍,發現一道題

給你六種面額1、5、10、20、50、100元的紙幣,假設每種幣值的數量都足夠多,編寫程序求組成N元(N為0-10000的非負整數)的不同組合的個數。


N=int(input())
dp=[1]*10001
for i in [5,10,20,50,100]:
for j in range(i,10001):
dp[j]=dp[j]+dp[j-i]#動態規劃
print(dp[N])
 

看見一個大神的代碼:

查了不少資料,把動態規劃看了一下,

dp=[1]*10001

這一步是創建了一個容器,或者說一個記事本,把已經出現的情況記錄下來,方便累計,其實吧,應該是用【0】來創建這個容器,但是為什麽用【1】?
這是因為,在這個題裏有一個1塊錢,也就是說,無論你要湊多少錢都至少有全是1塊錢組成的這一種可能,所以所有的面值拼湊的可能都要加一

for i in [5,10,20,50,100]:
for j in range(i,10001):
dp[j]=dp[j]+dp[j-i]#動態規劃
print(dp[N])
,下面2層循環,可以看見 j 是從除了1以為的最小面值開始循環的,因為1這種情況已經考慮過了,為什麽從最小面值5開始循環,因為5之前都只能有1種可能了,不用考慮
那麽從金額是5開始,dp[5]記下了當金額是5的時候有多少種可能,即 全是一塊的dp[j]加上有一個五塊的即dp[5-5],一共有2種可能 以此往下循環dp[5],dp[6],dp[7],dp[8],dp[9]
都是兩種可能,就是全1元組成或者一張5元加上一些1元組成。從dp[10]開始不一樣了,dp[10] = dp[10]+dp[10-5] 結果是3 就是全用1元組合dp[10] 加上包含一張5元的情況下另外2種可能,就是5塊,5塊,和5塊,5個一塊這2種組合
加在一起用了3種方法,記錄下來,然後繼續,每夠一次五塊,就會多出2種方法,

關於動態規劃的一點研究