题目描述
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
思路问题
这是博客http://hawstein.com/posts/dp-novice-to-advanced.html上面的一个入门的小例子。
动态规划算法的核心是:每个子问题的状态和状态的转移方程。
状态是:dp[i] ,即凑够i元最少需要的硬币的个数
转移方程是:dp[i] = min(dp[i-C1]+1,dp[i-C2]+1,dp[i-C3]+1,……,dp[i-Cj]+1])
即,每个状态的值都是最小的那个。
编写代码
说明:通过递归函数dp_fun实现了对状态数组dp的初始化
#include<iostream>
using namespace std;
int coin[3] = {1,3,5};
int dp[12] ;
int min(int a,int b)
{
return (a<b)? a:b;
}
void dp_fun(int i,int num)
{
if(i == 0)
{
dp[i] = 0;
dp_fun(1,num);
return;
}
else
{
int MIN = 9999;
for(int j=0;j<3;j++)
{
if(i>=coin[j])
{