完全背包问题模型转换 Leetcode 322零钱兑换 Leetcode 518零钱兑换II

地址

https://leetcode-cn.com/problems/coin-change/submissions/

描述

在这里插入图片描述

思想

代码

class Solution {
    
    
public:
    //本题可以看出是完全背包问题,那怎么向我们熟悉的完全背包模型进行转化呢
    //可以将amount看为背包的体积m,将coin的面额看为单个物品的体积,将物品的价值看为1
    //因此本题实质上试求装满背包后,背包装载的最小价值是多少
    int coinChange(vector<int>& coins, int m) {
    
    
        //f[i][j] 表示从前i种硬币中选,且总体积恰好为j的所得到的最小价值。
        //1e8表示没法凑成m
        vector<int> f(m+1,1e8);
        //背包体积为0时,最小价值为0
        f[0]=0;
        for(int i=0;i<coins.size();i++){
    
    
            int v=coins[i];
            for(int j=v;j<=m;j++){
    
    
                f[j]=min(f[j],f[j-v]+1);
            }
        }
        if(f[m]==1e8) return -1;
        else return f[m];
    }
};

地址

https://leetcode-cn.com/problems/coin-change-2/

描述

在这里插入图片描述

思想

代码

class Solution {
    
    
public:
    int change(int m, vector<int>& coins) {
    
    
        vector<int>f(m+1);
        f[0]=1;
        for(int i=0;i<coins.size();i++){
    
    
            int v=coins[i];
            for(int j=v;j<=m;j++){
    
    
                f[j]+=f[j-v];
            }
        }
        return f[m];

    }
};

猜你喜欢

转载自blog.csdn.net/qq_52934831/article/details/121789603
今日推荐