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;
}
};
可以简化为一维的
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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。