0
点赞
收藏
分享

微信扫一扫

【LeetCode】 322. 零钱兑换 【dp】


dp[i][j] 表示 最后一次用第j个面额换的情况下的最小次数

那么dp[i][j] 就等于
对于所有的k
那么 dp[ i- coins[j] ][k] + 1
里面的最小的

class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int n = coins.size();
auto dp = vector< vector<int> > (amount+1, vector<int>(n,amount+1) );
for(int i=0;i<n;++i){
dp[0][i] = 0;
}

for(int i=1; i<= amount; ++i){
for(int j=0;j<n;++j){
for(int k=0;k<n;++k){
if( i-coins[j]>=0 ){
dp[i][j] = std::min<int>(1 + dp[ i - coins[j] ][k],dp[i][j]);
}
}
}
}

int ans = amount+1;
for(int i=0;i<n;++i){
ans = std::min<int>(ans,dp[amount][i]);
}
if(ans == amount+1){
return -1;
}
return ans;
}
};

【LeetCode】 322. 零钱兑换 【dp】_商业

可以简化为一维的

class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int Max = amount + 1;
vector<int> dp(amount + 1, Max);
dp[0] = 0;
for (int i = 1; i <= amount; ++i) {
for (int j = 0; j < (int)coins.size(); ++j) {
if (coins[j] <= i) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
};

作者:LeetCode-Solution

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


举报

相关推荐

0 条评论