int coinChange(vector<int>& coins, int amount) {
const int INF = 1e9;
function<int(int)> minCoins = [&](int rem) -> int {
if (rem == 0) return 0;
int best = INF;
for (int coin : coins) {
if (coin <= rem) best = min(best, 1 + minCoins(rem - coin));
}
return best;
};
int ans = minCoins(amount);
return ans >= INF ? -1 : ans;
}
private static final int INF = 1_000_000_000;
public int coinChange(int[] coins, int amount) {
int ans = minCoins(coins, amount);
return ans >= INF ? -1 : ans;
}
private int minCoins(int[] coins, int rem) {
if (rem == 0) return 0;
int best = INF;
for (int coin : coins) {
if (coin <= rem) best = Math.min(best, 1 + minCoins(coins, rem - coin));
}
return best;
}
def coin_change(coins: list[int], amount: int) -> int:
def min_coins(rem: int) -> float:
if rem == 0: return 0
best = float('inf')
for coin in coins:
if coin <= rem: best = min(best, 1 + min_coins(rem - coin))
return best
ans = min_coins(amount)
return -1 if ans == float('inf') else int(ans)
function coinChange(coins: number[], amount: number): number {
const minCoins = (rem: number): number => {
if (rem === 0) return 0;
let best = Infinity;
for (const coin of coins) {
if (coin <= rem) best = Math.min(best, 1 + minCoins(rem - coin));
}
return best;
};
const ans = minCoins(amount);
return ans === Infinity ? -1 : ans;
}
int coinChange(vector<int>& coins, int amount) {
const int INF = 1e9;
unordered_map<int, int> memo;
function<int(int)> minCoins = [&](int rem) -> int {
if (rem == 0) return 0;
auto it = memo.find(rem);
if (it != memo.end()) return it->second;
int best = INF;
for (int coin : coins) {
if (coin <= rem) best = min(best, 1 + minCoins(rem - coin));
}
memo[rem] = best;
return best;
};
int ans = minCoins(amount);
return ans >= INF ? -1 : ans;
}
private static final int INF = 1_000_000_000;
public int coinChange(int[] coins, int amount) {
Map<Integer, Integer> memo = new HashMap<>();
int ans = minCoins(coins, amount, memo);
return ans >= INF ? -1 : ans;
}
private int minCoins(int[] coins, int rem, Map<Integer, Integer> memo) {
if (rem == 0) return 0;
Integer cached = memo.get(rem);
if (cached != null) return cached;
int best = INF;
for (int coin : coins) {
if (coin <= rem) best = Math.min(best, 1 + minCoins(coins, rem - coin, memo));
}
memo.put(rem, best);
return best;
}
def coin_change(coins: list[int], amount: int) -> int:
memo: dict[int, float] = {}
def min_coins(rem: int) -> float:
if rem == 0: return 0
cached = memo.get(rem)
if cached is not None: return cached
best = float('inf')
for coin in coins:
if coin <= rem: best = min(best, 1 + min_coins(rem - coin))
memo[rem] = best
return best
ans = min_coins(amount)
return -1 if ans == float('inf') else int(ans)
function coinChange(coins: number[], amount: number): number {
const memo = new Map<number, number>();
const minCoins = (rem: number): number => {
if (rem === 0) return 0;
const cached = memo.get(rem);
if (cached !== undefined) return cached;
let best = Infinity;
for (const coin of coins) {
if (coin <= rem) best = Math.min(best, 1 + minCoins(rem - coin));
}
memo.set(rem, best);
return best;
};
const ans = minCoins(amount);
return ans === Infinity ? -1 : ans;
}
int coinChange(vector<int>& coins, int amount) {
const int INF = 1e9;
vector<int> dp(amount + 1, INF);
dp[0] = 0;
for (int a = 1; a <= amount; a++) {
for (int coin : coins) {
if (coin <= a) dp[a] = min(dp[a], dp[a - coin] + 1);
}
}
return dp[amount] >= INF ? -1 : dp[amount];
}
public int coinChange(int[] coins, int amount) {
final int INF = 1_000_000_000;
int[] dp = new int[amount + 1];
Arrays.fill(dp, INF);
dp[0] = 0;
for (int a = 1; a <= amount; a++) {
for (int coin : coins) {
if (coin <= a) dp[a] = Math.min(dp[a], dp[a - coin] + 1);
}
}
return dp[amount] >= INF ? -1 : dp[amount];
}
def coin_change(coins: list[int], amount: int) -> int:
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for a in range(1, amount + 1):
for coin in coins:
if coin <= a: dp[a] = min(dp[a], dp[a - coin] + 1)
return -1 if dp[amount] == float('inf') else dp[amount]
function coinChange(coins: number[], amount: number): number {
const dp = new Array<number>(amount + 1).fill(Infinity);
dp[0] = 0;
for (let a = 1; a <= amount; a++) {
for (const coin of coins) {
if (coin <= a) dp[a] = Math.min(dp[a], dp[a - coin] + 1);
}
}
return dp[amount] === Infinity ? -1 : dp[amount];
}
int coinChange(vector<int>& coins, int amount) {
if (amount == 0) return 0;
if (amount < 0 || coins.empty()) return -1;
vector<int> sorted;
for (int c : coins) if (c > 0) sorted.push_back(c);
sort(sorted.begin(), sorted.end());
vector<int> dp(amount + 1, amount + 1);
dp[0] = 0;
for (int a = 1; a <= amount; a++) {
for (size_t k = 0; k < sorted.size(); k++) {
int coin = sorted[k];
if (coin > a) break;
int cand = dp[a - coin] + 1;
if (cand < dp[a]) dp[a] = cand;
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
public int coinChange(int[] coins, int amount) {
if (amount == 0) return 0;
if (amount < 0 || coins == null || coins.length == 0) return -1;
int[] sorted = Arrays.stream(coins).filter(c -> c > 0).sorted().toArray();
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp[0] = 0;
for (int a = 1; a <= amount; a++) {
for (int k = 0; k < sorted.length; k++) {
int coin = sorted[k];
if (coin > a) break;
int cand = dp[a - coin] + 1;
if (cand < dp[a]) dp[a] = cand;
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
def coin_change(coins: list[int], amount: int) -> int:
if amount == 0: return 0
if amount < 0 or not coins: return -1
sorted_coins = sorted(c for c in coins if c > 0)
dp = [amount + 1] * (amount + 1)
dp[0] = 0
for a in range(1, amount + 1):
for k in range(len(sorted_coins)):
coin = sorted_coins[k]
if coin > a: break
cand = dp[a - coin] + 1
if cand < dp[a]: dp[a] = cand
return -1 if dp[amount] > amount else dp[amount]
function coinChange(coins: number[], amount: number): number {
if (amount === 0) return 0;
if (amount < 0 || coins.length === 0) return -1;
const sorted = Int32Array.from(coins.filter((c) => c > 0)).sort();
const dp = new Int32Array(amount + 1).fill(amount + 1);
dp[0] = 0;
for (let a = 1; a <= amount; a++) {
for (let k = 0; k < sorted.length; k++) {
const coin = sorted[k];
if (coin > a) break;
const cand = dp[a - coin] + 1;
if (cand < dp[a]) dp[a] = cand;
}
}
return dp[amount] > amount ? -1 : dp[amount];
}