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背包问题的主要内容,如果未能解决你的问题,请参考以下文章