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

原创 2017年01月03日 23:09:45

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

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


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

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

总结——01背包问题 (动态规划算法)

0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。 问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?...
  • xp731574722
  • xp731574722
  • 2017年04月25日 20:57
  • 8882

01背包问题(动态规划)python实现

在01背包问题中,在选择是否要把一个物品加到背包中,必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比较,这种方式形成的问题导致了许多重叠子问题,使用动态规划来解决。n=5是物品的数量,c=...
  • littlethunder
  • littlethunder
  • 2014年05月22日 12:13
  • 15948

用动态规划算法解决0-1背包问题

用动态规划算法解决0-1背包问题需要了解以下基本概念和原理: 1.使用动态规划算法必须具备两个基本要素:最优子结构性质和重叠子问题性质 2.动态规划算法常以自底向上的方式计算最优值,也就是说,从最...
  • qq_24059821
  • qq_24059821
  • 2016年04月30日 21:44
  • 5514

01背包问题C++递归关系 动态规划

  • 2011年04月24日 15:04
  • 1KB
  • 下载

动态规划6-背包问题+记忆递归

转自:http://blog.csdn.net/mengzhejin/article/details/37880857 2个问题: 1)背包问题的动态规划解法 2)动态规划的另一种实...
  • ltx06
  • ltx06
  • 2014年12月22日 16:59
  • 684

背包问题---递归及动态规划

背包问题,递归,动态规划
  • cjc211322
  • cjc211322
  • 2014年04月20日 11:58
  • 1035

01背包问题的动态规划解法

参考http://www.cnblogs.com/qinyg/archive/2012/04/26/2471829.html http://www.cnblogs.com/xy-kidult/arc...
  • u011499425
  • u011499425
  • 2016年09月30日 09:48
  • 139

【转】 01背包问题 动态规划解法

动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。 比如01背包问题。 /* 一个旅行者有一个最多能用M公斤的背包,现在有N件物品, 它们的...
  • u013501457
  • u013501457
  • 2014年05月20日 20:29
  • 576

c c++ 01背包问题动态规划解决

  • 2013年11月05日 16:45
  • 28KB
  • 下载

动态规划解01背包问题

  • 2017年04月18日 20:01
  • 135KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧
举报原因:
原因补充:

(最多只允许输入30个字)