关闭

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

标签: 背包问题动态规划优化
589人阅读 评论(0) 收藏 举报
分类:

当背包重量是整数时,动态规划可以用数组存储状态就可以了。

当背包重量是非整数时,用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 };

//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。


除了最基本思路的动态规划,滚动数组优化,还有

基于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         (非常详细的博客)



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18375次
    • 积分:426
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    最新评论