有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<10000),求组合n分钱所需要的最少硬币数?

有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<10000),求组合n分钱所需要的最少硬币数?

动态规划的典型例题,首先定义dp[n],存放从0-n所需要的最小硬币数,v[i]存放硬币的面值,初始化dp[0] = 0,得出状态转移方程dp[i]=min{dp[i-1]+1,dp[i-v[j]] +1 },且i-1>=0&&i-v[j]>=0。

public class MinimumCoins {
    public void dfs(int v[],int n){
        int dp[] = new int[n];
        dp[0] = 0;
        int j = 0;
        for(int i = 1;i<n;i++){
            if(i==1){
                j = 0;
            }
            if(i==2){
                j =1;
            }
            if(i==3){
                j = 2;
            }
            if(i==5){
                j=3;
            }
            if(i-1>=0&&i-v[j]>=0){
                dp[i] = dp[i-1]+1<dp[i-v[j]]+1?dp[i-1]+1:dp[i-v[j]]+1;
            }

        }
        System.out.println("最少需要硬币数:"+dp[n-1]);
    }
    public static void main(String[] args) {
        MinimumCoins m = new MinimumCoins();
        int[] v = {1,2,4,5};
        m.dfs(v,12);
    }
}

猜你喜欢

转载自www.cnblogs.com/menbo/p/11365298.html
今日推荐