前言:
背包问题:
给定一组物品,每种物品都有自己的重量和价格,
在限定的总重量内,我们如何选择,才能使得物品的总价格最高
题目:
思路: 转移方程不太好理解
1 初始化dp数组为10001 dp[0] = 0
2 转移方程 dp[j] = min(dp[j],dp[j - coin] + 1)
3 dp[amount] 值如果是10001 返回-1
外层遍历物品
内层遍历背包,背包下标从物品开始
(一)代码
class Solution { public int coinChange(int[] coins, int amount) { int[] dp = new int[amount + 1]; //因为amount 0 <= amount <= 10的4次方,初始dp数组都为10001 Arrays.fill(dp, 10001); //dp[0] = 0 dp[0] = 0; //外层循环遍历物品 //内层循环遍历背包,背包下标从物品开始 //硬币面值 for(int coin : coins){ //总金额 for(int j = coin; j < amount + 1; j++){ //dp[j] = min(dp[j], dp[j - coin] + 1) //当前填满容量j最少需要的硬币 = //min( 之前填满容量j最少需要的硬币, 填满容量 j - coin 需要的硬币 + 1个当前硬币) dp[j] = Math.min(dp[j], dp[j - coin] + 1); } } return dp[amount] != 10001 ? dp[amount] : -1; } }
放空