- 前面找钱问题的升级版本:返回给出硬币组合表示目标综合的最小的硬币数目:
- coins = [1, 2, 5], amount = 11, return 3 (11 = 5 + 5 + 1)
- coins = [2], amount = 3 return -1.
int coinChange(vector<int>& coins, int amount) {
vector<int> need(amount+1, amount+1);
need[0] = 0;
for (int c : coins)
for (int a=c; a<=amount; a++)
need[a] = min(need[a], need[a-c] + 1);
return need.back() > amount ? -1 : need.back();
}
int coinChange(vector<int>& coins, int amount) {
vector<int> need(amount+1, amount+1);
need[0] = 0;
for (int a=1; a<=amount; a++)
for (int c : coins)
if (c <= a)
need[a] = min(need[a], need[a-c] + 1);
return need.back() > amount ? -1 : need.back();
}
int getChanges(int[] arr, int n) {
Arrays.sort(arr);
int dp[] = new int[n + 1];
dp[0] = 0;
for (int i = 1; i < dp.length; ++i) {
dp[i] = n + 1;
}
for (int i = 0; i < arr.length; ++i) {
for (int j = 0; j <= n; ++j) {
if (j >= arr[i])
dp[j] = Math.min(dp[j], dp[j - arr[i]] + 1);
}
}
return dp[n];
}