前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >背包问题

背包问题

作者头像
我没有三颗心脏
发布2018-04-26 16:05:37
5280
发布2018-04-26 16:05:37
举报
文章被收录于专栏:Java WebJava Web

问题描述

假设你是一个贪婪的小偷,背着可以装35磅重东西的背包,在商场伺机偷窃各种可以装入背包的商品。

你力图往背包中装入价值最高的商品,你会用哪种算法呢?

同样你也可以采取贪心策略,这非常简单。

  • ①盗窃可装入背包的最贵商品。
  • ②再盗窃还可装入背包的最贵商品,以此类推。

只是这次这种贪心策略并不好使了,例如你可以盗窃以下三种商品:

你的背包可以装35磅的东西。其中音响最贵,你把它偷了,但是背包没有空间装其他东西了。

这样你偷到了价值3000美元的东西。但是,如果不是偷音响,而是偷笔记本电脑和吉他,那么将会偷到价值3500美元的东西!

在这里,贪心策略显然不能获得最优解。但非常接近。

从这个示例中或许还可以得到如下启示:在有些情况下,完美是优秀的敌人。有时候,你只需找到一个能够大致解决问题的算法,此时贪心算法正好可以派上用场,因为它实现起来很容易,得到的结果又与正确结果相当接近。

代码实现

有了上面的思想,那么实现代码就变得简单了,主要代码如下:

代码语言:javascript
复制
private static int bag_problem(int[] values, int[] weights) {
    int currentSpace = totalSpace;       // 当前背包剩余的空间
    int currentValue = 0;                // 当前背包的价值
    int goodsNumber = values.length;    // 商品数量

    // 用来表示商品是否被装载,0表示没有,1表示装载
    int[] isLoad = new int[goodsNumber];
    for (int i = 0;i < goodsNumber;i++) {
        isLoad[i] = 0;
    }   // end for

    while (true) {
        int maxValue = 0;
        int postion = 0;        // 记录位置信息

        for (int j = 0; j < goodsNumber; j++) {
            // 如果物品已经被装载则跳过
            if (isLoad[j] == 1) continue;

            if (values[j] > maxValue && currentSpace >= weights[j]) {
                maxValue = values[j];
                postion = j;
            }
        }   // end inner for:找到了当前最大的values值

        // 背包已经装不下东西了
        if (maxValue == 0) break;

        // 装载物品
        currentSpace = currentSpace - weights[postion];
        currentValue += values[postion];
        isLoad[postion] = 1;
    }

    return currentValue;
}

参考资料:《算法图解》—— Aditya Bhargava 著

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档