Formular:
dp[i] = MIN( dp[i - coins[j]] + 1 ) (j: [0, coinSize - 1])
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int coinChange(int *coins, int coinSize, int amount)
{
int i, j;
int *dp = calloc(amount + 1, sizeof(int));
int min_so_far;
int prev;
int result;
dp[0] = 0;
for (i = 1; i <= amount; i++) {
min_so_far = INT_MAX;
for (j = 0; j < coinSize; j++) {
prev = i - coins[j];
if (prev < 0 || dp[prev] == -1)
continue;
if (dp[prev] + 1 < min_so_far)
min_so_far = dp[prev] + 1;
}
dp[i] = min_so_far == INT_MAX ? -1 : min_so_far;
}
result = dp[amount];
free(dp);
return result;
}
References
[1] https://leetcode.com/problems/coin-change