1. 程式人生 > >換錢的最少貨幣數---貨幣可重複用

換錢的最少貨幣數---貨幣可重複用

這裡寫圖片描述

這裡寫圖片描述

package com.lyf.dp;

import org.junit.Test;

/**
 * Created by fangjiejie on 2017/5/18.
 */
public class MinCurrency {
    public int getMinNumber(int arr[],int aim){
        if(arr==null||arr.length==0||aim<0){
            return -1;
        }
        int n=arr.length;
        int dp[][]=new int[n][aim+1
]; int max=Integer.MAX_VALUE; //dp[0..N-1][0]預設值為0,表示找的錢數為0時需要的錢幣最少張數,因為不需要任何錢幣。預設為0就好了 for(int j=1;j<=aim;j++){//求只能使用arr[0]貨幣的情況下,找1...aim所用的最少張數 dp[0][j]=max; if(j>=arr[0]&&dp[0][j-arr[0]]!=max){ dp[0][j]=dp[0][j-arr[0]]+1; } } for
(int i=1;i<n;i++){ //剩下的位置,從左到右,從上到下計算dp[i][j],dp[i][j]表示找的錢數為j時, // 所用的錢幣類別從arr[0]到arr[i]為止,所用的最小錢幣數量 for(int j=1;j<=aim;j++){ int left=max; if(j>=arr[i]&&dp[i][j-arr[i]]!=max){ left=dp[i][j-arr[i]]+1
;//如果j-arr[i]這些錢所用錢幣數可數,那麼j這些錢只需要再加上一張arr[i]錢幣就可以了 } dp[i][j]=Math.min(dp[i-1][j],left);//跟不用arr[i]這種錢幣所用的最少錢幣數作比較,取一個最少值 } } return dp[n-1][aim]==max?-1:dp[n-1][aim]; } @Test public void test(){ int a[]={5,2,3}; int aim=20; System.out.println(getMinNumber(a,aim)); }//結果是4 }