题目
举例
解答
假设arr=[5,2,3],aim=15
数组arr长度N
设数组dp[N][aim]
- dp[i][0] (i∈[0,N])为数组第一列,表示使用arr[i]的货币换的钱数0时,需要的钱的张数,全部标为0。
- dp[0][j] (j∈[0,aim])为数组第一行,表示使用arr[0]的货币换钱数j时,需要的钱的张数。arr[0]=5,aim=15,则dp[0][5]=1,dp[0][10]=2,dp[0][15]=3,其余的标为int.max。
- 剩下的位置,从左到右、从上到下计算,计算到dp[N][aim]时得到结果。计算步骤如下:
- 不能使用当前货币arr[i]的情况时,则继承上一枚货币的张数,即dp[i][j] = dp[i-1][j]
- 只够使用1张当前货币arr[i]的情况时,则使用上一枚货币凑j-arr[i]时的张数+1,即dp[i][j] = dp[i-1][j - arr[i]]+1
- 只够使用2张当前货币arr[i]的情况时,则使用上一枚货币凑j-arr[i]时的张数+1,即dp[i][j] = dp[i-1][j - 2*arr[i]]+2
- 只够使用3张当前货币arr[i]的情况时,则使用上一枚货币凑j-arr[i]时的张数+1,即dp[i][j] = dp[i-1][j - 3*arr[i]]+3
归纳以上情况,最终取得到转态转移方程dp[i][j] = min(dp[i-1][j],min(dp[i-1][j-k*arr[i]]+k))