演算法專題導航頁面
【題目描述】
給定陣列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 即是 下表以目標錢數...