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

用一个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]];
}
}
而一个背包被算了多次,代表数量可以无限,第一个代码可用于每种物品都无限的题目。
本文深入解析动态规划这一优化问题解决方法,介绍其基本概念,包括阶段、状态和无后效性的关键特性。通过分析子问题与原问题的关系,确立状态转移方程,并探讨不同实现方式,如01背包问题的滚动数组技巧。
4万+

被折叠的 条评论
为什么被折叠?



