動態規劃 換錢方法

2021-07-27 10:48:46 字數 2307 閱讀 3456

/*****************************

換錢方法

給定陣列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...