每日一题之动归-换钱的最少次数(二)
題目:上一道題是給定一個(gè)錢的數(shù)組,可以使用任意張數(shù)。接下來改變一下題目:給定數(shù)組arr,arr中所有的值都是正數(shù)。每個(gè)值僅代表一張錢的面值,再給定一個(gè)整數(shù)aim代表要找的錢數(shù),求組成aim的最少貨幣數(shù)。
例子:
arr=[5,2,3],aim=20。
這里5+2+3=10最大才是10,所以不能組成,返回-1。
arr=[5,2,5,3],aim=10。
這里有兩種可能一種是5+5 ,還有一種是5+2+3,我們選擇兩次的,返回2。
arr=[5,2,5,3 ],aim=15。
這里返回4。
arr=[5,2,5,3],aim=0。
不用任何貨幣就可以組成0元,返回0。
分析:這里和我們的上一道題很類似。
我們一樣使用經(jīng)典的動(dòng)態(tài)規(guī)劃來做,時(shí)間復(fù)雜度在O(N×aim)。
如果我們arr的長(zhǎng)度為N,目標(biāo)錢值為aim。我們生成一個(gè)大小為N X aim的二維數(shù)組dp。dp[i][j]的含義是在只使用arr[0..i]貨幣的情況下,組成j所需要的最小張數(shù)。所以同樣的計(jì)算方法如下:
1.dp[0..N-1][0]的值表示找的錢數(shù)為0的時(shí)候需要的最少?gòu)垟?shù),錢數(shù)為0時(shí),完全不需要任何貨幣所以全部設(shè)置為0. 我們這里使用的是java初始化,所以不需要特意的去把數(shù)組初始化為0。
2.dp[0][0..aim]表示只能使用arr[0]貨幣的情況下找某個(gè)簽署的最小張書。比如,arr[0]=2,那么能找開的錢數(shù)只能為2所以令dp[0][2]=1
其他位置都是找不開的,其余一律設(shè)為32位整數(shù)最大值,我們把這個(gè)值記為max。
3.基本步驟哦做完后,如果j-arr[i]<0,則dp[i][j]=dp[i-1][j]。
如果大于0則dp[i][j]=min{dp[i-1][j],dp[i-1][j-arr[i]]+1}。代碼如下:
總結(jié)
以上是生活随笔為你收集整理的每日一题之动归-换钱的最少次数(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。