LeetCode動的計画法0-1ナップサック問題

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];


    }
};

おすすめ

転載: blog.csdn.net/ahelloyou/article/details/113618422