LeetCode 322 Coin Change (完全背包)

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

Note:
You may assume that you have an infinite number of each kind of coin.


题目链接:https://leetcode.com/problems/coin-change/

题目分析:因为个数是无穷的,所以就是一个完全背包计数问题,dp[i]表示合到i所需要的最少个数,dp初始化为无穷大,dp[0] = 0
public class Solution {
    
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 0; i < coins.length; i ++) {
            for(int j = 0; j <= amount; j ++) {
                int pre = j - coins[i];
                if(pre >= 0 && dp[pre] < Integer.MAX_VALUE) {
                    dp[j] = Math.min(dp[j], dp[pre] + 1);
                }
            }
        }
        if(dp[amount] == Integer.MAX_VALUE) {
            return -1;
        }
        return dp[amount];
    }
}


回答: LeetCode上的背包问题是指在给定一组物品和一个背包的容量的情况下,选择哪些物品放入背包,使得背包中物品的总价值最大。根据物品的选择限制,背包问题可以分为0-1背包问题、完全背包问题和多重背包问题等不同类型。[2] 对于0-1背包问题,每种物品只能选择0个或1个,即要么放入背包,要么不放入。这种情况下,可以使用动态规划来解决,定义一个二维数组dp[i][j]表示前i个物品放入容量为j的背包中所获得的最大价值。通过状态转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])来更新dp数组,其中weight[i]表示第i个物品的重量,value[i]表示第i个物品的价值。最终,dp[n][W]即为所求的最大价值,其中n为物品的个数,W为背包的容量。[3] 完全背包问题是指每种物品可以选择任意个数,即可以重复放入背包。在解决完全背包问题时,可以将其转化为0-1背包问题来求解。具体做法是将每个物品拆分成多个重量和价值相同的物品,然后按照0-1背包问题的方法进行求解。[1] 多重背包问题是指每种物品有一定的数量限制,即每种物品可以选择0个到nums[i]个。对于多重背包问题,可以将其转化为0-1背包问题来求解。具体做法是将每个物品拆分成多个重量和价值相同的物品,然后按照0-1背包问题的方法进行求解。[1] 总结来说,背包问题是在给定一组物品和背包容量的情况下,选择合适的物品放入背包,使得背包中物品的总价值最大。根据物品的选择限制,背包问题可以分为0-1背包问题、完全背包问题和多重背包问题等不同类型,可以使用动态规划的方法来解决。[2][3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值