LeetCode 动态规划0-1背包问题

本文介绍了一种使用动态规划解决硬币找零问题的方法。通过定义DP数组,记录在给定硬币集合中能否组合出特定金额的所有可能性。文章详细解释了状态转移方程及其背后的逻辑思考。
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        // 转化为01背包问题描述
        // 给你一个总重量是amount的书包和N个物体,每个物体的重量已经给出,问是否有一种装法能够把背包装满

        /* 典型的背包问题 */

        /* 所以要明确两点   【状态】 【选择】 
            【状态】 :在运算过程中会变化的量  ==可以选择的物体(因为放进去了就不能选择了)==    ==剩余重量(物体放进去了下次能放进去的物体就会有限制)==
        
            【选择】 : 放或者不放
        
        */

        /* 
            定义DP[]数组的含义,dp[i][j]代表前i个硬币中能否凑出金额j
         */

         /* 
            状态转移矩阵
            if(dp[i-1][j]==true) dp[i][j]=true;     // 装入或者不装入
            if(dp[i-1][j]==false) {
                if(dp[i-1][j-coins[i]) {
                    dp[i][j]=true;
                } else {
                    dp[i][j]=false
                }
            }
          */

          /* 
            data_base 

            dp[...][0] = true
            dp[0][1...] =false;
           */



           vector<vector<int>> dp(coins.size()+1,vector<int>(amount+1,false));

           for(int i=0;i<coins.size();i++) {
               dp[i][0]=true;
           }


            for(int i=1;i<coins.size()+1;i++) {
                for(int j=1;j<amount+1;j++) {
                    // 防止背包容量不够
                    if(j-coins[i-1]<0) {
                        dp[i][j]=dp[i-1][j];
                    } else {
                        // 开始做出选择
                        dp[i][j]=dp[i-1][j] | dp[i-1][j-coins[i-1]];
                    }
                }
            }


            return dp[coins.size()][amount];


    }
};
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值