题目描述
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
分析:
动态规划算法的核心是:每个子问题的状态和状态的转移方程。
状态是:dp[i] ,即凑够i元最少需要的硬币的个数。
根据题意可以写出状态转移方程:dp[i] = min{ dp[i-1] , dp[i-3] , dp[i-5] } + 1;
代码如下:
#include <iostream>
#define INFTY 9999
using namespace std;
int arr[100] = { 0 };
int coin[3] = { 1, 3, 5 };
int Min(int a, int b, int c){
int min = a;
if (a > b)
min = b;
if (min > c)
min = c;
return min;
}
int main()
{
for (int i = 1; i <= 11; i++){
int temp[3] = { INFTY, INFTY, INFTY };
for (int j = 0; j < 3; j++){
if (i - coin[j] >= 0)
temp[j] = arr[i - coin[j]] + 1;
}
arr[i] = Min(temp[0], temp[1], temp[2]);
}
for (int i = 0; i <= 11; i++)
{
cout << arr[i] << endl;
}
}