zoukankan      html  css  js  c++  java
  • 01背包问题

    问题描述:

       有N件物品和一个载重量为C的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

    问题特点:

       每种物品仅有一件,可以选择放或不放。(0:不放  1:放)

    基本思路:

       用p[i][j]表示从i件物品中选择物品放入一个容量为j的背包中可以获得的最大价值。得到如下关系:

       1.p[i][0] = p[0][j] = 0 ··········· (1)

       2.p[i][j] = p[i - 1][j] (当j < w[i]) ············· (2)

          p[i][j] = max{p[i - 1][j], p[i - 1][j - w[i]] + v[i]} (当j > w[i])·············(3)

       以下解释这几个式子的含义。

       (1)式:当物品数量为0或者背包载重量为0时,显然最大价值为0.

       (2)式:当背包载重量j小于第i个物品的重量w[i]时,第i个物品无法装入背包,故此p[i][j] = p[i - 1][j]。

       (3)式:这是最关键的式子。当背包容量j大于第i个物品的重量w[i]时,产生两种选择:将第i个物品放进背包或不放进背包。由于只有两种情况,因此只需比较这两种情况下所取得的最大总价值,然后取较大者。max{···,···}中,p[i - 1][j]是不把第i件物品放进背包时所能获得的最大价值,p[i - 1][j - w[i]] + v[i]是把第i件物品放进背包时所能取得的最大价值。p[i - 1][j - w[i]] + v[i]这条式子如何理解?其实很简单。背包载重量为j,当把第i件物品放进背包时,用来容纳前i - 1件物品的容量只剩下j - w[i],p[i - 1][j - w[i]]就是前i - 1件物品在背包载重余量为j - w[i]的情况下所能取得的最大价值,再加上第i件物品的价值v[i],就得到把第i件物品放入背包时所能取得的最大价值。


    参考题目:点击打开链接

  • 相关阅读:
    1105 Spiral Matrix (25分)(蛇形填数)
    1104 Sum of Number Segments (20分)(long double)
    1026 Table Tennis (30分)(模拟)
    1091 Acute Stroke (30分)(bfs,连通块个数统计)
    1095 Cars on Campus (30分)(排序)
    1098 Insertion or Heap Sort (25分)(堆排序和插入排序)
    堆以及堆排序详解
    1089 Insert or Merge (25分)
    1088 Rational Arithmetic (20分)(模拟)
    1086 Tree Traversals Again (25分)(树的重构与遍历)
  • 原文地址:https://www.cnblogs.com/cszlg/p/2910439.html
Copyright © 2011-2022 走看看