博客
关于我
ACM HDU Bone Collector 01背包
阅读量:444 次
发布时间:2019-03-06

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

在解决01背包问题时,贪心算法并不总是有效。例如,当某个物品的单位价值低,但能与其他物品组合后带来更高的总价值时,贪心算法可能无法找到最优解。因此,动态规划方法更为适合这种情况。

动态规划方法

我们将使用一个二维数组 dp,其中 dp[i][j] 表示前 i 个物品放入体积为 j 的背包中所能获得的最大价值。

初始化

  • dp 数组初始化为 0,因为最开始没有放入任何物品。

状态转移

对于每个物品 i,遍历所有可能的背包体积 j

  • 如果物品 i 的体积 vol[i] 小于等于 j,则可以放入背包。此时,dp[i][j] 的值为 dp[i-1][j]dp[i-1][j - vol[i]] + val[i] 中的最大值。
  • 否则,dp[i][j] 仍为 dp[i-1][j],即不放入该物品。

处理特殊情况

  • 对于体积为 0 的物品,单位价值为无穷大,应优先放入背包。

代码实现

#include 
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define MAX 0x3f3f3f3f#define MIN -0x3f3f3f3f#define N 100int val[N];int vol[N];int dp[N][N]; // 使用二维数组保存状态int main() { int T; int n, v; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &v); for (int i = 1; i <= n; i++) { scanf("%d", &val[i]); } for (int i = 1; i <= n; i++) { scanf("%d", &vol[i]); } memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { for (int j = 0; j <= v; j++) { if (vol[i] <= j) { dp[i][j] = max(dp[i-1][j], dp[i-1][j - vol[i]] + val[i]); } else { dp[i][j] = dp[i-1][j]; } } } printf("%d\n", dp[n][v]); } return 0;}

解释

  • 初始化:读取输入数据,初始化 dp 数组为 0
  • 遍历物品:对于每个物品,遍历所有可能的背包体积。
  • 状态更新:检查物品是否能放入背包,更新 dp 数组。
  • 输出结果:打印 dp[n][v],即第 n 个物品处理后,背包体积为 v 时的最大价值。
  • 这种方法确保了我们能够找到最优解,适用于所有情况,包括体积为 0 的物品。

    转载地址:http://aojyz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers下载与加载geoserver的wms服务显示地图
    查看>>
    VS.NET版本与VC版本对应关系
    查看>>
    Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
    查看>>
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
    查看>>
    Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
    查看>>
    Openlayers中加载GeoJson文件显示地图
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上打点并显示图标和文字
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    OpenLayers使用点要素作为标记
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers各组件默认的css样式
    查看>>