背包问题模板

一、0-1背包

状态:背包容量为j时,求前i个物品所能达到最大价值,设为dp[i][j]。初始时,dp[0][j](0<=j<=V)为0,没有物品也就没有价值。

状态转移方程:由上述分析,第i个物品的体积为w,价值为v,则状态转移方程为

  • j<w,dp[i][j] = dp[i-1][j] //背包装不下该物品,最大价值不变
  • j>=w, dp[i][j] = max{ dp[i-1][j-list[i].w] + v, dp[i-1][j] } //和不放入该物品时同样达到该体积的最大价值比较

结构体:存放物品的体积和价值

struct Thing
{
int w;
int v;
}list[];

1.init():dp[][]数组初始化

int s, n;//背包容量和物品总数
void init()
{
for (int i = ; i <= s; i++) dp[][i] = ;//没有物品时最大价值均为0
}

2.package():执行背包,求解问题

void package()
{
for (int i = ; i <= n; i++)//循环每个物品,执行状态转移方程
{
for (int j = ; j <= s; j++)
{
if (j >= list[i].w) dp[i][j] = max(dp[i - ][j], dp[i - ][j - list[i].w] + list[i].v);
else dp[i][j] = dp[i - ][j];
}
}
}

优化后的一维01背包

1.init():dp[][]数组初始化

int s, n;//背包容量和物品总数
void init()
{
for (int i = ; i <= s; i++) dp[i] = ;//初始化二维数组//没有物品时最大价值均为0
}

2.package():执行背包,求解问题

void package()
{
for (int i = ; i <= n; i++)//循环每个物品,逆序遍历j执行状态转移方程
{
for (int j = s; j >= list[i].w; j--)
{
dp[j] = max(dp[j], dp[j - list[i].w] + list[i].v);
}
}
}

二、完全背包

1.init():dp[][]数组初始化

void init()
{
for (int i = ; i <= s; i++) dp[i] = ;//初始化二维数组//没有物品时最大价值均为0
}

2.package():执行背包,求解问题,正序遍历即可实现复用。

void package()
{
for (int i = ; i <= n; i++)//循环每个物品,正序遍历j执行状态转移方程
{
for (int j = list[i].w; j <= s; j++)
{
dp[j] = max(dp[j], dp[j - list[i].w] + list[i].v);
}
}
}

最新文章

  1. 一个服务器要绑定多个HTTPS站点
  2. CDT
  3. 内部类中class声明地方不同,效果不一样
  4. python 行转列
  5. puppet report import
  6. 解决Linux下Oracle中文乱码的一些心得体会 ,转自
  7. django中通过model名字获取model
  8. 小程序server-3-搭建WebSocket 服务
  9. 【机器学习】TensorFlow学习(一)
  10. SQL-PL/SQL基础
  11. 产生AJAX跨域问题的原因
  12. Django学习笔记(2)--视图函数
  13. ES6字符串和正则表达式改动
  14. 网络编程之Socket详解
  15. CAD绘制扶手5.6
  16. PHP定界符&lt;&lt;&lt;eof 使用
  17. JForum 源码分析
  18. web前端工程师在移动互联网时代里的地位问题 为啥C/S系统在PC端没有流行起来,却在移动互联网下流行了起来 为啥移动端的浏览器在很多应用里都是靠边站,人们更加倾向于先麻烦自己一下,下载安装个客户端APP
  19. SQL SERVER深入学习学习资料参考
  20. python-随机数的产生random模块

热门文章

  1. PHP:网展cms后台任意文件删除和sql注入
  2. 文件夹上传控件webupload插件
  3. 异常0xc000041d的抛出过程
  4. OpenFOAM——设置非均匀边界方法总结
  5. 二分法递归版本(c++)
  6. 组合模式( Composite Pattern)
  7. 【Beta阶段】第九次Scrum Meeting
  8. C# 序列化与反序列化之xml通过实现IXmlSerializable进行序列化的解决方案
  9. gcc 编译两个so其中soA依赖soB
  10. Linux下安装java及配置(yum安装)