- 原题链接: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){
// 定义 dp
int[] 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));
}
}