#17
1-D Dynamic Programming
1-D DPGiven coin denominations and a target amount, return the fewest coins needed (or -1 if impossible). Unlimited coins of each kind.
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];
}def coin_change(coins, amount)
dp = Array.new(amount + 1, Float::INFINITY)
dp[0] = 0
(1..amount).each do |a|
coins.each do |coin|
dp[a] = [dp[a], dp[a - coin] + 1].min if coin <= a
end
end
dp[amount].infinite? ? -1 : dp[amount]
end