动态规划--凑零钱.钱币的组合有多少种(java)

凑零钱.钱币的组合有多少种

  • 钱币的组合有多少种
  • 暴力递归
    • 解题思路
    • 代码演示
  • 动态规划
    • 解题思路
  • 代码演示
  • 动态规划专题

钱币的组合有多少种

arr是货币数组,其中的值都是正数。
再给定一个正数aim。 每个值都认为是一张货币,
即便是值相同的货币也认为每一张都是不同的,
返回组成aim的方法数
例如:arr = {1,1,1},aim = 2 第0个和第1个能组成2,
第1个和第2个能组成2,
第0个和第2个能组成2 一共就3种方法,
所以返回3

暴力递归

解题思路

递归时先确定base case ,
1.如果钱币数组的里的钱币已经选择完了,就结束了,
2.如果aim < 0 了,代表选择不正确,也要结束了
剩下的是递归过程,每次到一个钱币时.
我们有两种选择,一个是选一个是不选两种情况,两种情况都是不同的选择.
加到一起就行了.

代码演示

 /**
     * 递归获得组合数
     * @param arr
     * @param aim
     * @return
     */
    public static int coinWays(int[] arr, int aim) {
        return process(arr, 0, aim);
    }

    /**
     * 递归
     * @param arr 钱币数组
     * @param index 下标
     * @param aim 要组成的钱
     * @return
     */
    public static int process(int[]arr,int index,int aim){
        //base case
        if (aim < 0){
            return 0;
        }
        //当数组走完 如果aim == 0 就是有效的一次组合 返回1,否则返回0,
        if (index == arr.length){
            return aim == 0 ? 1 : 0;
        }
        //每次到一个位置 都要两种选择,选择和不选择
        //不选择的情况 aim 不变
        int p1 = process(arr,index+1,aim);
        //选择的情况 aim 剪掉已经选择的.
        int p2 = process(arr,index+1,aim-arr[index]);
        return p1 + p2;
    }

动态规划

解题思路

动态规划就是对递归的改写.先观察递归里的变化的参数.
根据可变参数来定动态规划表.
分为三步:
一.根据base case 来初始化动态规划表.
二.把递归过程改成从表格种取数据.
三.返回递归调用的最初始的过程.

代码演示

/**
     * 动态规划
     * @param arr
     * @param aim
     * @return
     */
    public static int dp(int[] arr, int aim){
        int N = arr.length;
        int[][] dp = new int[N + 1][aim + 1];
        //根据base case 来初始化值
        dp[N][0] = 1;
        //把递归过程改成从表中拿
        for (int i = N - 1;i >= 0;i--){
            for (int j = 0; j <= aim;j++){
                int p1 = dp[i + 1][j];
                int p2 = j - arr[i] < 0 ? 0 : dp[i + 1][j - arr[i]];
                dp[i][j] = p1 + p2;
            }
        }
        //返回递归调用的最初始状态
        return dp[0][aim];
    }

动态规划专题

最小路径和

象棋里马走到指定位置的方法数

leetcode1143. 最长公共子序列

leetcode.486. 预测赢家

背包问题–填满背包的最大价格

你可能感兴趣的:(数据结构,算法,java,java,动态规划,算法,leetcode,数据结构)