您的位置:首页 > 其它

01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧

2017-01-03 23:09 597 查看
当背包重量是整数时,动态规划可以用数组存储状态就可以了。
当背包重量是非整数时,用map存储状态就可以了!主要思路:  map(构造函数中参数comp是仿函数(或者叫函数对象))+递归优化(“去冗余思想”,把重复计算的东西存下来以便后续用到就不再重复计算了)(==动态规划) +滚动数组优化
主要代码如下:

int value
= { 3, 2, 5, 2 };
const double W2 = 5.2;
double weight2
= { 2.1, 1.1, 3.1, 2.1 };
const int error1 = -10000;

//comp是仿函数(或者叫函数对象)
struct comp
{
typedef std::pair<int, double> value_type;
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<std::pair<int, double>, int, comp> res;

int search2map(int idx, int sumW)//解决非整数  背包问题的方法:  map+(递归优化==动态规划)  +滚动数组优化
{
if (sumW>W2){ return error1; }
if (idx >= N){ return 0; }
std::map<std::pair<int, double>, int, comp>::iterator it = res.find(std::make_pair(idx % 2, sumW));
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         (非常详细的博客)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息