中级农民
- 积分
- 100
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-10-10
- 最后登录
- 1970-1-1
|
我之前想的是先换大面额的,比如用106换{25,10,5,1},就先换4张25,再换1张5,最后换1张1.但是如果提供的零钱面值不是这样有规律的话,这样换可能换不开,比如用106换{20,5,3,2},先换5张20,再换一张5块,这样导致换不开(虽然是可以用5张20,两张3换开)。还是用DP吧,现在leetcode上已经有这道题了322. Coin Change
(https://leetcode.com/problems/coin-change/)
贴下我的DP答案, C++
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int numCoin = coins.size();
if(amount == 0) return 0;
vector<int> count(amount+1, -1);
for(int i = 0; i < numCoin; i++) {
if(coins[i] <= amount) count[coins[i]] = 1;
}
for(int i = 1; i <= amount; i++) {
for(int j = 0; j < numCoin; j++) {
if(i-coins[j] < 0 || count[i - coins[j]] < 0) continue;
else { // i - coints[j] >= 0 && count[i - coins[j]] > 0
if(count[i] < 0) count[i] = count[i - coins[j]] + 1;
else count[i] = min(count[i], count[i - coins[j]] + 1);
}
}
}
return count[amount];
}
}; |
|