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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_26408419/article/details/53999209

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

当背包重量是非整数时,用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<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         (非常详细的博客)



阅读更多
博主设置当前文章不允许评论。
换一批

没有更多推荐了,返回首页