从大到小排序, 贪心法,对于
[186,419,83,408]
6249
这样的test case跑不过去
for (auto c : coins) { while (amount -c > 0) {amount -= c;} }
只能对[1,2,5] 11这种可以
322. Coin Change
#include <iostream>
#include <vector>
class Solution {
private:
int _coinChange(const std::vector<int>&coins, int rem, std::vector<int>& count) {
if (rem < 0) {return -1;}
if (rem == 0) {return 0;}
if (count[rem-1] != 0) {
return count[rem-1];
}
int min = INT32_MAX;
for (int coin : coins) {
int res = _coinChange(coins, rem-coin, count);
if (res >= 0 && res < min) {
min = 1 + res;
}
}
count[rem-1] = (min == INT32_MAX) ? -1 : min;
return count[rem-1];
}
public:
int coinChange(std::vector<int>& coins, int amount) {
if (amount < 1) {
return 0;
}
std::vector<int> count(amount, 0);
return _coinChange(coins, amount, count);
}
};
int main(int argc, char *argv[]) {
Solution s;
std::vector<int> v = {186,419,83,408}; // [419,408,186,83]
int amount = 6249; // 419*5+408*8+186*3+83*4
std::cout << s.coinChange(v, amount) << std::endl;
}
20
g++ leetcode322.cpp -std=c++14 -Wall
默认C++98报错:
leetcode322.cpp:13:19: warning: range-based for loop is a C++11 extension [-Wc++11-extensions]
for (int coin : coins) {
^
leetcode322.cpp:35:20: error: non-aggregate type 'std::vector<int>' cannot be initialized with an
initializer list
std::vector<int> v = {186,419,83,408};
^ ~~~~~~~~~~~~~~~~
1 warning and 1 error generated.
range-based for loop, C++11
for (std::vector<int>::const_iterator it = coins.begin(); it != coins.end(); ++it) {
int res = _coinChange(coins, rem - *it, count);
// ...
}
C++98 要用数组初始化vector
int a[] = {186,419,83,408};
std::vector<int> v(a, a + sizeof(a)/sizeof(a[0]));