C语言凑硬币动态规划,《凑硬币》 动态规划算法入门

题目描述

如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?

思路问题

动态规划算法的核心是:每个子问题的状态和状态的转移方程。

状态是: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

using namespace std;

int coin[3] = {1,3,5};

int dp[12] ;

int min(int a,int b)

{

return (a

}

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])

{

MIN = min(dp[i-coin[j]]+1,MIN);

}

}

dp[i] = MIN;

if(i == num)return;

else

dp_fun(i+1,num);

}

}

int main()

{

dp_fun(0,11);//表示要凑齐11元的硬币

for(int i=0;i<12;i++)

{

cout<

}

return 0;

}

输出结果:

凑齐0元,至少需要0枚硬币

凑齐1元,至少需要1枚硬币

凑齐2元,至少需要2枚硬币

凑齐3元,至少需要1枚硬币

凑齐4元,至少需要2枚硬币

凑齐5元,至少需要1枚硬币

凑齐6元,至少需要2枚硬币

凑齐7元,至少需要3枚硬币

凑齐8元,至少需要2枚硬币

凑齐9元,至少需要3枚硬币

凑齐10元,至少需要2枚硬币

凑齐11元,至少需要3枚硬币

上面的程序是用递归写的,比较长,下面在写一个用两层循环的:

talk is cheap ,show me the code:

#include

using namespace std;

int coin[3] = {1,3,5};

int dp[12] ;

void dp_fun(int num)

{

dp[0] = 0;

for(int i=1;i<=num;i++)

{

dp[i] = 9999;

for(int j=0;coin[j]<=i&&j<3;j++)

{

if(dp[i-coin[j]]+1 < dp[i])

dp[i] = dp[i-coin[j]]+1;

}

}

}

int main()

{

dp_fun(11);//表示要凑齐11元的硬币

for(int i=0;i<12;i++)

{

cout<

}

return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值