目录
- 1- 思路
- 动态规划
- 2- 实现
- ⭐322. 零钱兑换——题解思路
- 3- ACM 实现
- 原题链接:322. 零钱兑换
1- 思路
动态规划
动规五部曲
- 1- 定义 dp 数组确定含义
dp[j]
代表凑到金钱为j
的最少硬币个数
- 2- 递推公式
dp[j] = Math.min(dp[j],dp[amount-]+1)
- 3- 初始化
dp[0] = 0
- 其他全部初始化为 max
- 4- 遍历顺序
- 先遍历物品,再遍历背包
- 递推过程需要判断
dp[j - coins[i]] != max
2- 实现
⭐322. 零钱兑换——题解思路
class Solution {public int coinChange(int[] coins, int amount) {// 1. 定义 dp 数组// dp[j] 代表凑到金钱为 j 的最少硬币个数int[] dp = new int[amount+1];// 2.递推公式// dp[j] = Math.min(dp[j],dp[amount-]+1)// 初始化dp[0] = 0;int max = Integer.MAX_VALUE;for(int i = 1 ; i <= amount;i++){dp[i] = max;}// 4. 遍历顺序// 物品for(int i = 0 ; i < coins.length;i++){for(int j = coins[i] ; j <= amount ; j++){if(dp[j - coins[i]] != max){dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);}}}if(dp[amount]==max){return -1;}return dp[amount];}
}
3- ACM 实现
public class minCoins {public static int minCoins(int[] nums,int target){// 定义 dpint[] dp = new int[target+1];// 2. 递推公式// dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);// 3.初始化dp[0] = 0;int max = Integer.MAX_VALUE;for(int i = 1 ; i <= target;i++){dp[i] = max;}// 4.遍历顺序for(int i = 0 ; i <nums.length;i++){for(int j = nums[i]; j<=target;j++){if(dp[j-nums[i]] != max){dp[j] = Math.min(dp[j],dp[j-nums[i]]+1);}}}if(dp[target]==max){return -1;}return dp[target];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String input = sc.nextLine();String[] parts = input.split(" ");int[] nums = new int[parts.length];for(int i = 0 ; i < parts.length;i++){nums[i] = Integer.parseInt(parts[i]);}int target = sc.nextInt();System.out.println("结果是"+minCoins(nums,target));}
}