动态规划

本文深入解析动态规划这一优化问题解决方法,介绍其基本概念,包括阶段、状态和无后效性的关键特性。通过分析子问题与原问题的关系,确立状态转移方程,并探讨不同实现方式,如01背包问题的滚动数组技巧。

动态规划是多阶段决策过程最优化问题的一种方法。
阶段:把问题分成几个相互联系的有顺序的几个环节,这些环节即称为阶段。
状态:某一阶段的出发位置称为状态。
基本条件:只有解决和当前决策与过去状态无关的问题(无后效性)

  • 分析子问题和原问题
  • 确定状态
  • 确定状态转移方程
  • 确定实现方法
    在这里插入图片描述
    用一个bool数组表示是否能f[i][j]组成体积j,,初值是f[i][j]=0,f[0][0]=0
    if (f[i-1][k]==1) f[i][k+v[i]]=1,f[i][k]=1;
    关于01滚动,和就地滚动,每一行的结果实际上至于前一行有关。对于本题,更常用的是就地滚动,用一个一维数组,但是
for(i=1;i<=n;i++)
{
    for(j=c[i];j<v;j++)
    {
        if(!f[j]) f[j]=f[j-c[i]];
    }
}

变成一维后发生问题了,一个物品会计算多次。
怎样解决呢?
改变内层循环顺序。

for(i=1;i<=n;i++)
{
    for(j=v;j>=c[i];j--)
    {
        if(!f[j]) f[j]=f[j-c[i]];
    }
}

而一个背包被算了多次,代表数量可以无限,第一个代码可用于每种物品都无限的题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值