美文网首页
0-1背包问题

0-1背包问题

作者: david161 | 来源:发表于2022-05-12 10:34 被阅读0次

有n件物品和一个最大承重为W的背包,每件物品的重量是w[i],价值是v[i]
在保证总重量不超过W的前提下,选择某些物品装入背包,背包的最大总价值是多少?
注意:每个物品只有一件,也就是每个物品只能选择0件或者1件
分析:
假设:W=10,有5件物品,重量和价值如下:
w[1]=2,v[1]=6
w[2]=2,v[2]=3
w[3]=6,v[3]=5
w[4]=5,v[4]=4
w[5]=4,v[5]=6
dp数组的计算结果如下表:


image.png

i:选择i件物品 j:最大承重
解法:
dp方程:
如果:
可以选这一件物品
j > w[i]
不选:
dp(i,j) = dp(i - 1, j)

代码:

package com.david.alth.dp; 

/**
* 0-1背包 ,计算最大价值 
*/ 
public class Bag2 { 
    public static int maxValue(int[] values,int[] weights,int max){ 
        if(values == null || values.length == 0) return 0; 
        if(weights == null || weights.length == 0) return 0; 
        if(values.length != weights.length || max <= 0) return 0; 

        //dp数组 
        int[][]dp = new int[values.length+1][max+1];  
        for(int i = 1; i <= values.length; i++){ 
            for(int j = 1; j <= max; j++){ 
                //选择的物品超过最大承重
                if(j<weights[i-1]){ 
                    //最大价值=上一轮的最大价值(不选择该物品) 
                    dp[i][j]=dp[i-1][j]; 
                }
                //可选择该物品 
                else{
                    //上一轮的最大价值(不选择该物品) ,选择该物品 两者的最大值 
                    dp[i][j] = Math.max((dp[i-1][j]), values[i-1] + dp[i-1][j- weights[i-1]]); 
                } 
            } 
        }
        return dp[values.length][max]; 
    }
    
    public static void main(String[] args) { 
        int[] values={6,3,5,4,6}; 
        int[] weights={2,2,6,5,4}; 
        int max=10; 
        System.out.println(maxValue(values,weights,max)); 
    } 
}

时间复杂度为:O(i * j)
可以看出动态规划是计算的值是上次的某个值+这次的值
是一种用空间换时间的算法。

相关文章

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 背包问题

    背包问题属于典型的动态规划问题。这里我们将详细介绍0-1背包,完全背包和多重背包问题 一、 0-1背包 有N件物品...

  • 算法-动态规划-背包问题

    背包问题是基础的动态规划问题,包含了0-1背包,完全背包,多重背包等。 0-1背包 存在容量为 的背包 , 件体...

  • 背包问题

    1、前言 背包问题是典型的动态规划问题,它有非常多的类型,本文讨论最常见的0-1背包问题 0-1背包问题描述:有一...

  • (python实现)购物单问题

    购物单问题实际上是0-1问题,在解决这个问题之前,要理解0-1背包问题。可以自己百度或者阅读我对0-1背包问题的理...

  • 动态规划

    0-1背包问题 自己实现的0-1背包问题的动态规划解法,先贴上吧,动态规划原理解释有空再写。

  • 动态规划常见面试题

    子序列类型编辑距离 最长递增子序列 最大子数组 最长公共子序列 背包问题0-1背包问题 子集背包问题 完全背包问题...

  • 编程

    今天用0-1算法,编写了背包问题!

  • LeetCode 动态规划专题 5:0-1 背包问题

    这一节我们介绍使用动态规划解决的一个非常经典的问题:0-1 背包问题。 0-1 背包问题描述 问题描述: 有一个背...

  • 数据结构与算法笔记day23:动态规划

    1初识动态规划 这节课的内容不涉及动态规划的理论,而是通过两个例子:0-1背包问题、0-1背包问题升级...

网友评论

      本文标题:0-1背包问题

      本文链接:https://www.haomeiwen.com/subject/vnxkurtx.html