完全揹包1 換錢的最少貨幣數322

2021-10-18 12:36:44 字數 1030 閱讀 2305

給k種面值的硬幣,面值在乙個陣列中num,可用數量無限,求最少幾枚硬幣可以湊出target

如果此時的硬幣數量都是只能用乙個,則dp[i][j]表示0到i的陣列中可以用的元素任意組合出j用的最少硬幣,則dp[i][j]=min(dp[i-1][j],dp[i-1][j-num[j]]+1).但是現在因為硬幣的數量是無限的,所以i這個位置處的元素可以用多次,又因為j是從小遍歷到大的,所以減前面的情況都算過了,只需要算最後一種也就是只用一次num[j]的情況,dp[i][j]=min(dp[i-1][j],dp[i][j-num[j]]+1).

然後初始狀態j=0時全為0,i=0時需要算所有可能由coins[0]得到的錢數.然後算dp[i][j-num[j]]時的技巧是設定乙個left=0.每次進入等於max,然後判斷dp[i][j-num[j]]可否得到,得到則讓left=它,最終dp[i][j]=min(dp[i-1][j],left).

class

solution

}int left=0;

for(

int i=

1;i) dp[i]

[j]=math.

min(dp[i-1]

[j],left);}

}return dp[n-1]

[amount]

==max?-1

:dp[n-1]

[amount];}

}

怎麼狀態壓縮呢,首先得到這個值要的是上一行的值和這一行左邊的值,所以要從左到右來更新這一行的值.

class

solution

}int left=0;

for(

int i=

1;i) dp[j]

=math.

min(dp[j]

,left);}

}return dp[amount]

==max?-1

:dp[amount];}

}

換錢的最少貨幣數

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

換錢的最少貨幣數

題目一 給定陣列arr,arr中所有的值都為正數。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。如 arr 5,2,3 aim 20.最少需要4張 解題思路 經典動態規劃一般分為3部,先求dp i j 矩陣中第一列的值,然後求d...

換錢的最少貨幣數

換錢的最少貨幣數 給定陣列arr,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個 aim,代表要找的錢數,求組成aim的最少貨幣數。輸入描述 輸入包括兩行,第一行兩個整數n 0 n 1000 代表陣列長度和aim 0 aim 5000 第二行n...