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];
}
};
LeetCode動的計画法0-1ナップサック問題
おすすめ
転載: blog.csdn.net/ahelloyou/article/details/113618422
おすすめ
ランキング