0-1 背包问题 - 求装入背包中的所有物品的最大价值

标签: 动态规划 0-1背包问题
10人阅读 评论(0) 收藏 举报
分类:

题目

一个背包有一定的承重 W,有 N 件物品,每件都有自己的价值,记录在数组 v 中,也都有自己的重量,记录在数组 w 中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。

思路

假设物品编号从 1 到 n,一件一件物品考虑是否加入背包。
假设 dp[x][y] 表示前 x 件物品,在不超过重量 y 的时候的最大价值。枚举一下第 x 件物品的情况:

  • 情况一:如果选第 x 件物品,则前 x - 1 件物品得到的重量不能超过 y - w[x]。
  • 情况二:如果不选 x 件物品,则前 x - 1 件物品得到的重量不能超过 y。

无论哪种情况,我们都需要去求解 x - 1 件物品的情况。

所以,dp[x][y] 可能等于 dp[x-1][y],也就是不取第 x 件物品的时候,价值和之前的一样。
也可能是 dp[x-1][y - w[x]] + v[x],也就是决定拿第 x 件物品的情况,当然会加上 x 物品的价值。
两种可能性中,应该选择价值最大的那个,状态转移方程如下:
dp[x][y] = Max{dp[x-1][y], dp[x-1][y-w[x]]+v[x]}

对于 dp 矩阵来说,行数是物品的数量 n,列数是背包的最大承重 w。然后再从左到右,从上到下计算所有的 dp 的值即可。

该矩阵中的每个值的求解都代表一个更小的背包问题。
初始情况一:对于第0列,它的含义是背包的容量为0。此时物品的价值呢?没有。因此,第一列都填入0。
初始情况二:对于第0行,它的含义是屋内没有物品。那么没有任何物品的背包里的价值多少呢?还是没有!所有都是0。
所以我们可以把这个矩阵的大小定义为 dp[n+1][y+1],从第二行第二列也就是 dp[1][1] 的位置开始带入状态转移方程进行计算,其实这也解决了我长期以来对这个矩阵的行列都+1的困扰

代码

public class Solution {
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A: Given n items with size A[i]
     * @param V: Given n items with value V[i]
     * @return: The maximum value
     */
    public int backPackII(int m, int[] A, int[] V) {
        // 1.定义状态矩阵,dp[i][j]表示在0..i个物品中不超过j重的情况下的背包的最大价值
        int[][] dp = new int[A.length + 1][m + 1];
        // 2.状态转移方程:dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-A[i-1]] + V[i-1])
        for (int i = 1; i <= A.length; i++) {
            for (int j = 1; j <= m; j++) {
                dp[i][j] = dp[i-1][j];
                if (j >= A[i-1]) {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-A[i-1]] + V[i-1]);
                }
            }
        }
        return dp[A.length][m];
    }
}
查看评论

0-1背包问题,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

  • 2010年07月15日 00:22
  • 756B
  • 下载

回溯法求0/1背包问题

回溯法求0/1背包问题给定n件物品和一个容量为c的背包,物品的重量为Wi,其价值为Vi,0/1背包问题是如何选择背包的物品,其中背包的物品是不可分割的,怎样使得背包中的物品价值最大?#include"...
  • chr1341901410
  • chr1341901410
  • 2016-11-30 22:58:07
  • 809

回溯法解0-1背包问题(王晓东算法例题)

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 整个解的空间相当于一个二叉树,左边是0,代表不取这个物品,右边是...
  • NK_test
  • NK_test
  • 2015-06-04 23:30:57
  • 3356

0 1背包问题 C语言版

#include /*0 1背包问题。每个物品都有其价值和体积,并且每个物品只有一个, 将其装入一个容积有限的背包中,最大价值为多少? N物品数量,C背包容积,w每个物品体积,v每个物品价值 */ ...
  • shirenfeigui
  • shirenfeigui
  • 2012-09-27 17:28:28
  • 5936

0-1背包问题,选择合适的物品时背包中价值最大

  • 2011年05月06日 22:40
  • 3KB
  • 下载

背包系列第三篇----01背包(求解最大价值的个数)

一:问题 01背包问题描述:一个容量为V的背包。现在有N种物品,每种只有一个物品,每种物品的体积是C1,C2,…,Cn,对应的每种的价值是W1,W2,…,Wn.。试问,在不超过背包容量的情况下,物品装...
  • LaoJiu_
  • LaoJiu_
  • 2016-04-27 16:29:07
  • 1049

C语言 0-1背包问题

0-1背包问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为p...
  • Hongsf985
  • Hongsf985
  • 2017-10-31 21:47:55
  • 145

0-1背包问题的各种解法

一.动态规划求解0-1背包问题 /************************************************************************/ /* 0-1背...
  • syaguang2006
  • syaguang2006
  • 2013-06-26 16:48:06
  • 754

动态规划法—0-1背包问题(一)

0-1背包问题 问题描述 给定n个物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?约束条件 放入背包的物品的重量...
  • u010924834
  • u010924834
  • 2015-05-15 08:21:57
  • 2542

0-1背包问题(需要输出具体背包序号)

6.0-1背包问题 (20分) C时间限制:3000 毫秒 |  C内存限制:3000 Kb 题目内容: 背包最大允许装载为C, 有n个物品要放进背包,每个物品的重量为w[1],w[2],....
  • hushhw
  • hushhw
  • 2017-11-03 19:25:00
  • 442
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 9万+
    积分: 1888
    排名: 2万+
    个人信息
    博客专栏
    最新评论