贪心算法之零一背包问题的求解

问题重述

0-1背包问题是指在给定一组物品和一个容量为若干的背包时,选择将哪些物品装入背包,使得装入的物品的总体积不超过背包容量,并且所装物品的总价值最大化。其中每个物品只有一个,即要么装入要么不装入,不能切分。因此称为0-1背包问题。该问题是计算机科学中的经典问题,具有重要的理论和实际应用价值。

问题求解

关于此问题的求解有两种方式

  1. 动态规划
  2. 贪心算法

此处我们只列举贪心算法求解

#include "iostream"
#include "algorithm"

/**.
 * 设置商品的个数
 */
#define N 5
struct node {
  /**.
   * 体积
   */
  int v;

  /**.
   * 价值
   */
  int w;
} goods[5];

void initGoods() {
  goods[0].v = goods[0].w = 0;
  goods[1].v = 1;
  goods[1].w = 2;
  goods[2].v = 2;
  goods[2].w = 4;
  goods[3].v = 3;
  goods[3].w = 4;
  goods[4].v = 4;
  goods[4].w = 5;
}

/**.
 * 根据价值选择最合适的搭配策略
 * @param V 最大容积
 */
int putAccordingToValue(int V) {

  int bagValue = 0;

  for (auto &good: goods) {

    if (good.v <= V) {

      V = V - good.v;

      bagValue += good.w;
    }
  }

  return bagValue;
}

void print() {
  for (auto &good: goods) {
    // 打印输出
    std::cout << good.v << " : " << good.w << std::endl;
  }
}
/**.
 * 程序的主函数
 * @return 主函数参数
 */
int main() {
  initGoods();

/*  std::sort(goods, goods + N, [](node &one, node &two) {
    if (one.w == two.w) {
      return one.v < two.v;
    }
    return one.w > two.w;
  });*/
  std::sort(goods, goods + N, [](node &one, node &two) {
    if ((float) one.w / one.v == (float) two.w / two.v) {
    return one.v < two.v;
  }
    return (float) one.w / one.v > (float) two.w / two.v;
  });

/*  std::sort(goods, goods + N, [](node &one, node &two) {
    if (one.v == two.v) {
      return one.w > two.w;
    }
    return one.v < two.v;
  });*/

  print();

  // 打印输出
  std::cout << "putAccordingToValue(5): " << putAccordingToValue(5)
            << std::endl;

  // 设置程序的默认返回值
  return 0;
}

此处通过切换使用不能的排序算法就可以实现不同方式求解背包问题,当然,这是基于贪心算法的,动态规划需要请留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值