動態規劃 換錢的方法數

2021-09-29 15:53:50 字數 1384 閱讀 4242

演算法專題導航頁面

【題目描述】

給定陣列arr,設陣列長度為n,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim,代表要找的錢數,求換錢的方法數有多少種。由於方法的種數比較大,所以要求輸出對10^9+7進行取模後的答案。

【輸入描述】

輸入包括兩行,第一行兩個整數n(0<=n<=1000)代表陣列長度和aim(0<=aim<=20000),第二行n個不重複的正整數,代表陣列arr(其任何乙個元素取值介於1到1000000000之間 )。

【輸出描述】

輸出乙個整數,表示換錢的方法數對10^9+7取模後的答案。

【示例1】

輸入4 15

5 10 25 1輸出6

說明53=15

101+51=15

101+15=15

110+51=15

52+15=15

115=15

【示例2】

輸入5 1000

2 3 5 7 10

輸出20932712

【備註】

時間複雜度o(n*aim),空間複雜度o(aim)。

【**實現 - cpp版】

#include

#include

using

namespace std;

intstatic mod =

1e9+7;

intcount_methods1

(const vector<

int>

& coins,

int aim)

// for the first row

for(

int j=

1; j*coins[0]

<=aim; j++

)// other scenarios

for(

int i=

1; ireturn dp[size-1]

[aim];}

intcount_methods2

(const vector<

int>

& coins,

int aim)

for(

int i=

1; ireturn dp[aim];}

intmain()

cout <<

count_methods2

(vec, aim)

;return0;

}

遞迴與動態規劃 換錢的方法數

問題 給定陣列arr,arr中所有的值都為整數且不重複。每個值代表一種面值的貨幣,每種貨幣有無數張,再給定乙個整數aim代表要找的錢數,求換錢的方法有多少種。基本思路 這道題的經典之處在於它可以體現暴力遞迴 記憶搜尋 動態規劃之間的關係,並可以在動態規劃的基礎上再進行一次優化。首先介紹暴力遞迴的方法...

換錢的方法數(動態規劃講的很好)

給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。舉例 arr 5,10,25,1 aim 0。組成0元的方法有1種,就是所有面值的貨幣都不用。所以返回1。arr 5,10,25,1 ai...

動態規劃 換錢方法

換錢方法 給定陣列arr,arr中所有的值都是整數且不重複,每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數,aim代表要找的錢數,求換錢有多少種方法。思路 1.建立一張二維表dp,m n 其中m表示貨幣的種類,行n表示 target 1 即是目標錢數 1 即是 下表以目標錢數...