1- 思路
动态规划
动规五部曲
- 1- 定义 dp 数组确定含义
- 2- 递推公式
- dp[j] = Math.min(dp[j],dp[amount-]+1)
- 3- 初始化
- 4- 遍历序次
- 先遍历物品,再遍历背包
- 递推过程需要判断 dp[j - coins] != 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));
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |