0
点赞
收藏
分享

微信扫一扫

Leetcode 322 coin change, 找零钱的最小张数


从大到小排序, 贪心法,对于

[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]));

举报

相关推荐

0 条评论