/*****************************換錢方法
給定陣列arr,arr中所有的值都是整數且不重複,每個值代表一種面值的貨幣,
每種面值的貨幣可以使用任意張,再給定乙個整數,aim代表要找的錢數,求換錢有多少種方法。
***********************************/
/*****************************
思路:1.建立一張二維表dp,m*n 其中m表示貨幣的種類,行n表示 target+1(即是目標錢數+1)
即是:(下表以目標錢數為5,錢的種類為3表示)
| 0 1 2 3 4 5
-----------------
2 | 1 0 1 0 1 0
3 | 1 0 0 0 0 0
4 | 1 0 0 0 0 0
2.初始化如上表
dp[ii][jj] 表示 用面值為 0,1,。。ii(即是當前面值包括前面的所有面值) 的貨幣對換 jj 元的方法數
3.對硬幣面值按從小到大排序
4.填充表
(1)使用 0 枚面值 ii的貨幣 dp[ii-1][jj-0*value]
(2)使用 1 枚面值 ii的貨幣 dp[ii][jj-1*value]
(3)使用 2 枚面值 ii的貨幣 dp[ii][jj-2*value]
(4)....類推 直至 jj-count*value<=0為止
(5)將上述結果累加即是最終 dp[ii][jj]的結果。
dp[ii][jj] =dp[ii-1][jj]+ dp[ii][jj-1*value]+ dp[ii][jj-2*value]。。。。
時間複雜度:
m*(n+1) m貨幣種類 n 目標錢數
空間複雜度:
m*(n+1) m貨幣種類 n 目標錢數
****************************/
intchangemoneyways
(vector
<
int>
money
,int
target
)//填充第一列
for(
intii=0
;ii<
money
.size
();ii
++)//填充第一行
for(
intii=1
;ii<
target+1
;ii++)else
}for
(intii=
1;ii<
money
.size
();ii
++)}
}//輸出填充的**,
for(
intii=0
;ii<
money
.size
();ii
++)cout
<<
endl
;cout
<<
endl;}
cout
<<
endl
;//刪除建立的陣列除錯用
intresult=dp
[money
.size()-
1][target
];for
(intii=
0;ii<
money
.size
();ii
++)return
result;}
/*******************************************
執行結果
貨幣的面值:
1 5 10 25 目標錢數: 15
填充後的**如下:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4
1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6
1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 6
最終的結果為: 6
請按任意鍵繼續. . .
********************************************/
動態規劃 換錢的方法數
演算法專題導航頁面 題目描述 給定陣列arr,設陣列長度為n,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim,代表要找的錢數,求換錢的方法數有多少種。由於方法的種數比較大,所以要求輸出對10 9 7進行取模後的答案。輸入描述 輸入包括...
遞迴與動態規劃 換錢的方法數
問題 給定陣列arr,arr中所有的值都為整數且不重複。每個值代表一種面值的貨幣,每種貨幣有無數張,再給定乙個整數aim代表要找的錢數,求換錢的方法有多少種。基本思路 這道題的經典之處在於它可以體現暴力遞迴 記憶搜尋 動態規劃之間的關係,並可以在動態規劃的基礎上再進行一次優化。首先介紹暴力遞迴的方法...
換錢的方法數(動態規劃講的很好)
給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。舉例 arr 5,10,25,1 aim 0。組成0元的方法有1種,就是所有面值的貨幣都不用。所以返回1。arr 5,10,25,1 ai...