換錢的最少貨幣數 動態規劃

2021-10-06 05:16:45 字數 1184 閱讀 6955

給定陣列arr,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個aim,代表要找的錢數,求組成aim的最少貨幣數。

輸入描述:

輸入包括兩行,第一行兩個整數n(0<=n<=1000)代表陣列長度和aim(0<=aim<=5000),第二行n個不重複的正整數,代表arr

輸出描述:

輸出乙個整數,表示組成aim的最小貨幣數,無解時輸出-1.

宣告陣列

a——面值種類

dp[j]——j元需要的最少貨幣數

只有a[0]一種面值,計算dp的具體數值(可以用幾張面值為dp[0]的貨幣來購買)

外層關於面值種類數i迴圈(i=1···n-1)——增加a[j]的面值(因為a[0]已算出,所以i為i+1種面值)

:內層關於要兌換的錢數j迴圈(j=1···aim)

::判斷j>a[i](因為不需要面值大於目標錢數)

:::if(dp[j-a[i]] = = -1) dp[j] = dp[j];//j-a[i]元不能被表示

:::else if(dp[j]==-1) dp[j] = dp[j-a[i]] + 1;

:::else dp[j] = min(dp[j], dp[j-a[i]]+1);

#include

#include

#define min(a,b) (((a)>(b))?(b):(a))

#define max(a,b) (((a)>(b))?(a):(b))

intmain()

for(

int i=

0; i)scanf

("%d"

,&a[i]);

//每個錢數需要的最少貨幣數

//dp[j]是j元需要的最少貨幣數

int dp[aim+1]

;//只有a[0]一種面值的情況下

for(

int j=

1; j<=aim; j++

)//有前i+1種面值的情況下

//已知前i-1種面值的情況下j元需要的最少貨幣數,求前i種面值的情況下j元需要的最少貨幣數

for(

int i=

1; i}printf

("%d\n"

, dp[aim]);

}return0;

}

C 換錢的最少貨幣數 動態規劃

include const int jud 65535 32位 int型最大整數 用來進行陣列的賦值 int mincoins const int arr,const int length,const int aim int main std cout mincoins arr,n,aim syst...

動態規劃C 實現 換錢的最少貨幣數

題目 換錢的方法數 給定陣列 arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。舉例 arr 5,2,3 aim 20.4張5元可以組成20元。返回 4 arr 5,2,3 aim 0 不使...

換錢最少貨幣數

給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,在給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。public class mincoins int len arr.length int max integer.max value...