题意理解
有任意数量的一组不同面值的硬币,对于给定总数的钱数,需要的最少的硬币数量是多少
问题分析
动规
动规的要点,状态量,状态转移方程
状态量是指定钱数i对应的最小硬币数量,用DP[i]表示;
状态转移方程为:
先设置硬币面额为coins[0...n-1].
DP[0] = 0;
DP[i] = min( DP [ i - coins [ j ] ] ) + 1, 0<=j <= n -1, 1 <= i <= amount.
其他
动规的状态转移方程,和 搜索方法的状态空间切换 本质是一样的。
链接
int coinChange(vector<int>& coins, int amount) {
if (coins.size() == 0 || amount == 0)
{
return 0;
}
int dp[amount + 1];
dp[0] = 0;
for(int i = 1; i <= amount; i ++)
{
dp[i] = -1;
int tmp = INT_MAX;
for(int j = 0; j < coins.size(); j++)
{
if (i - coins[j] >= 0 && dp[i - coins[j]] != -1)
{
tmp = min(tmp, dp[i - coins[j]]);
}
}
if (tmp == INT_MAX)
{
dp[i] == -1;
}
else
dp[i] = tmp + 1;
//cout << i << '\t' << dp[i] << endl;
}
return dp[amount];
}