题解 | #兑换零钱(一)#
兑换零钱(一)
https://www.nowcoder.com/practice/3911a20b3f8743058214ceaa099eeb45
#include <algorithm>
#include <vector>
class Solution {
public:
int minMoney(vector<int>& arr, int aim) {
if (!aim) return 0;
if (arr.empty()) return -1;
int lenarr = arr.size(), minarr = *min_element(arr.begin(), arr.end());
vector<int> dp(aim, 0);
int tmp;
for (int i = 0; i < aim; i++) {
if (i + 1 < minarr) { //小于最小货币面值
dp[i] = -1;
} else {
tmp = (1 << 31) - 1; //int型最大值
for (int j = 0; j < lenarr; j++) {
if (i + 1 == arr[j]) { //等于所给面值之一,即只需1张货币
dp[i] = 1;
break;
}
if (i - arr[j] >= 0) {
if (dp[i - arr[j]] != -1) { //可以在前面记录的最少货币数基础上加一张货币
dp[i] = dp[i - arr[j]] + 1 < tmp ? dp[i - arr[j]] + 1 : tmp;
tmp = dp[i];
}
}
}
if (dp[i] == 0) { //不可兑换
dp[i] = -1;
}
}
}
return dp[aim - 1];
}
};
