动态规划

本文探讨了如何运用动态规划解决最少硬币问题,通过递推方式找到兑换11元硬币所需的最少硬币数,并对比了与递归的不同。接着介绍了如何利用动态规划求解青蛙跳石、背包问题及项目投资组合优化,展示了如何在有限预算下选择项目以获得最大收益。
摘要由CSDN通过智能技术生成

最少硬币问题

【题目描述】

使用3枚币值分别为  1、3、5的硬币兑换11,最少需要几枚硬币。

【思路】

  1. 确定状态 :
    1. -最后一步:最优策略中使用的最后一枚硬币ak
    2. -化成子问题:用最少的硬币依次从小面值拼到大面值
    3. -状态:tmp[x]=最少用多少枚硬币拼出x
  2. 转移方程:tmp[i]=min{tmp[i-1]+1,tmp[i-3]+1,tmp[i-5]+1}
  3. 初始条件和边界情况:设初始值:tmp[0]=0因为转移方程无法求出tmp[0];若不能拼出来i,则tmp[i]为无穷大;
  4. 计算顺序:tmp[1],tmp[2]……tmp[11]
#include<iostream>
using namespace std;
#define INF  99999
int main(){
    int coin[3]={1,3,5};
    int tmp[12];//注意这里开数组要开11+1次
    tmp[0]=0;
    for(int i=1;i<12;i++){//试图拼出1-11的面值
            tmp[i]={INF};//将1到11的每个元素设置无穷大,以便于min中的比较
         for(int j=0;j<3;j++){
            if(i>=coin[j] && tmp[i-coin[j]]!=INF){/*若i<coin[j] 或者 tmp[i-coin[j]]+1是无穷大,则表示这个数字拼不出来*/           
                tmp[i]=min(tmp[i-coin[j]]+1,tmp[i]);//从tmp[i-1]+1,tmp[i-3]+1,tmp[i-5]+1中求出硬币最少的那个tmp,若拼不出来,则返回无穷大
            }
         }
    }
              if(tmp[11]==INF){//如果是这样,则拼不出11
        tmp[11]=-1;}
     cout << "tmp[11]=" << tmp[11] << endl;
    return 0;
}

动态规划与递归的区别:递归是自顶向下求,某个元素需求多次,时间复杂度高成指数次幂增长;而动态规划是自底向上求,保留了每个元素的值,时间复杂度低为:11*3

机器人走方格 

【题目描述】:M * N的方格,一个 机器人 从左上走到右下,只能向右或向下走。有多少种不同的走法?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值