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])

发布了15 篇原创文章 · 获赞 18 · 访问量 909

猜你喜欢

转载自blog.csdn.net/weixin_44983848/article/details/105725868
今日推荐