博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【01背包问题】
阅读量:4349 次
发布时间:2019-06-07

本文共 1254 字,大约阅读时间需要 4 分钟。

思路:

维持一个数组arr[i][j],表示前i个物品中的若干个,放入体积为j的背包中的最大价值。

每次放入第i个物品,就更新这个数组

动态规划递推关系式:

if (j < vol[i]) //当前物品的体积比当前背包体积大,放不进背包

  arr[i][j] = arr[i - 1][j];
else //放得进背包,逐一比较不放物品i与放物品i(背包体积为j-vol[j])的价值大小
  arr[i][j] = max(arr[i - 1][j], arr[i - 1][j - vol[i]] + cost[i]);

 

空间优化:arr[i][]只与arr[i-1][]有关,只需一个一维数组

 

1 int main() 2 { 3     int cost[6] = { 0,2,5,3,10,4 };    //5件物品的价值 4     int vol[6] = { 0,1,3,2,6,2 };    //5件物品的体积 5     int bagV = 12;                    //背包体积 6     while (cin >> bagV) 7     { 8         vector
> arr(6, vector
(bagV + 1, 0)); //arr[6][bagV+1]数组初始化 9 for (int i = 1;i < sizeof(cost) / sizeof(int);i++)10 {11 for (int j = 1;j <= bagV;j++)12 {13 if (j < vol[i]) //当前物品的体积比当前背包体积大,放不进背包14 arr[i][j] = arr[i - 1][j];15 else //放得进背包,逐一比较不放物品i与放物品i(背包体积为j-vol[j])的价值大小16 arr[i][j] = max(arr[i - 1][j], arr[i - 1][j - vol[i]] + cost[i]);17 cout << arr[i][j] << ' ';18 }19 cout << endl;20 }21 cout << arr[5][bagV] << endl;22 }23 return 0;24 }

 

转载于:https://www.cnblogs.com/xiao-gan/p/8631159.html

你可能感兴趣的文章
mongodb配置文件
查看>>
iphone开发学习,iphone5页面适配修改
查看>>
Log4net如何增加自定义字段(三种方式)
查看>>
简单实用的jQuery分页插件
查看>>
一行代码实现C#的四舍五入
查看>>
[转载]unity优化1
查看>>
最新LAMP教程,玩转linux
查看>>
切片的个人理解
查看>>
大数据 hadoop 环境搭建
查看>>
jmeter正则表达式解析
查看>>
17.centos7基础学习与积累-003-命令练习01
查看>>
Air Jordan 8 Retro Performance Review
查看>>
暑假生活第八周总结
查看>>
JQuery中的siblings()是什么意思
查看>>
(转)用graph-easy描绘kubenetes描绘k8s组件逻辑图
查看>>
Uiautomator 2.0 - 实战
查看>>
thinkphp去掉index.php
查看>>
C#经典之Application.DoEvents()的使用
查看>>
Spark的几个问题
查看>>
网页栅格系统研究(1):960的秘密
查看>>