当背包重量是整数时,动态规划可以用数组存储状态就可以了。
当背包重量是非整数时,用map存储状态就可以了!主要思路: map(构造函数中参数comp是仿函数(或者叫函数对象))+递归优化(“去冗余思想”,把重复计算的东西存下来以便后续用到就不再重复计算了)(==动态规划) +滚动数组优化
主要代码如下:
int value[N] = { 3, 2, 5, 2 };
const double W2 = 5.2;
double weight2[N] = { 2.1, 1.1, 3.1, 2.1 };
const int error1 = -10000;
//comp是仿函数(或者叫函数对象)
struct comp
{
typedef std::pair
bool operator () (const value_type & ls, const value_type &rs)
{
return ls.first < rs.first || (ls.first == rs.first && ls.second < rs.second);
}
};
std::map
int search2map(int idx, int sumW)//解决非整数 背包问题的方法: map+(递归优化==动态规划) +滚动数组优化
{
if (sumW>W2){ return error1; }
if (idx >= N){ return 0; }
std::map
if (it != res.end())
return it->second;
int aa = search2map((idx + 1), sumW);
int bb = search2map((idx + 1), sumW + weight2[idx]) + value[idx];
res.insert(std::make_pair(std::make_pair(idx % 2, sumW), mymax(aa, bb)));
return mymax(aa, bb);
}
main函数中:cout<< search2map(0, 0);//会得到在重量不大于5.2的情况下背包最大价值,得到正确结果为8。
(具体我写的c++代码,可百度云下载:链接:https://pan.baidu.com/s/1o9jnYSM 密码:2s0k
包括了整数背包,非整数背包的递归及动态规划,滚动数组实现)
除了最基本思路的动态规划,滚动数组优化,还有
①基于BFS的A*(广度搜索时用优先队列(堆)替换普通队列(即让队列单调有序)),双向广搜(从初始状态,目标状态两个方向搜索)
https://juejin.im/entry/5678d0bc60b2b7af14c37999
②四边形不等式和决策的单调性
http://blog.csdn.net/find_my_dream/article/details/4931222#
http://blog.leanote.com/post/okami/df2a864dff6d
http://www.voidcn.com/blog/judyge/article/p-4803284.html
https://github.com/ericliu859/AcmPaper/tree/master/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92
③树状数组优化,线段树优化,矩阵优化,斜率优化,其他优化等
http://www.cppblog.com/menjitianya/archive/2015/10/23/212084.html (非常详细的博客!!!)
http://blog.csdn.net/hbhcy98/article/details/50636489 (非常详细的博客)