oj系列:动态规划求解01背包问题

Posted 咳咳n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oj系列:动态规划求解01背包问题相关的知识,希望对你有一定的参考价值。

用动态规划求解01背包问题

题目描述
给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.

输入
输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
以后N行每行两个数Wi和Vi,表示物品的重量和价值

输出
输出1行,包含一个整数,表示最大价值。

样例输入
3 5
2 3
3 5
4 7

样例输出
8

这里使用二维数组解决,会更加通俗易懂的。
其实可以使用一维数组进行空间优化。

package oj;
import java.util.Scanner;

/**
 * @author JMChen
 * @date 2020/4/24
 */
public class ZeroOneBackpack 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        int num, weight;

        //求的是dp[num][weight]
        num = sc.nextInt();
        weight = sc.nextInt();

        int i, j;

		//假设第一个为0,方便下标计算
        int[] p = new int[num + 1];
        int[] w = new int[num + 1];
        int[][] table = new int[num + 1][weight + 1];


        // 默认下标为0的取值为0,方便计算
        for (i = 1; i <= num; i++) 
            w[i] = sc.nextInt();            //每个东西的重量
            p[i] = sc.nextInt();            //每个东西的价值
        

        //看成对d[i][j]的赋值
        //dp转移方程从d[1][1] 推出dp[num][weight]的值
        for (i = 1; i <= num; i++)
            for (j = 1; j <= weight; j++) 
                if (j < w[i]) table[i][j] = table[i - 1][j];
                else table[i][j] = Math.max(table[i - 1][j], table[i - 1][js - w[i]] + p[i]);
            
//可以将整个表打出来看看
//        for(i=0;i<=num;i++)
//        
//            for(j=0;j<=weight;j++)
//                System.out.print(table[i][j]+ "  ");
//            System.out.println();
//        

        System.out.print(table[num][weight]);
    


关键思路:转移方程
dp[i][j] = max(dp[i−1,j], dp[i−1][j−w[i]] + v[i])

以上是关于oj系列:动态规划求解01背包问题的主要内容,如果未能解决你的问题,请参考以下文章

动态规划 —— 背包问题一 专项研究学习

动态规划——01背包问题专项研究学习

动态规划中的0-1背包问题怎么去理解?要求给出具体实例和详细步骤。。。

动态规划求解0/1背包问题

背包问题

动态规划之01背包详解