0,1背包问题(动态规划)

1.问题描述:

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

输入格式

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

输出格式

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

样例输入

3 5
2 3
3 5
4 7

样例输出

8

数据规模和约定

  1<=N<=200,M<=5000.

 1 package com.xuzhiyuan.day5;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Test2 {
 6 
 7     public static void main(String[] args) {
 8         
 9         Scanner input=new Scanner(System.in);
10         
11         int n=input.nextInt();//n个物品
12         int m=input.nextInt();//背包容量为m
13         
14         int[] w=new int[n];//物品的重量
15         int[] v=new int[n];//物品的价值
16         
17         for(int i=0;i<n;i++) {//初始化物品的重量和价值
18             
19             w[i]=input.nextInt();
20             v[i]=input.nextInt();
21             
22         }
23         
24         int[][] dp=new int[n][m+1];//dp[i][j]表示前i个物品中背包重量为j时的最大价值
25         
26         //前i个物品最基本的重量为w[i],此时的价值为v[i];
27         for(int i=0;i<n;i++) {
28             
29             dp[i][w[i]]=v[i];
30             
31         }
32         
33         //dp[i][j]=max(d[i][j],d[i-1][j]);若j-a[i]存在,则dp[i][j]=max(dp[i][j],dp[i-1][j-w[i]]+v[i]);
34         //即dp[i][j]的最大价值为:初始情况下dp[i][j]的值和前i-1个物品重量为j时的最大价值dp[i-1][j]中的较大者和j-w[i]存在情况下dp[i-1][j-w[i]]+v[i](即用第i个物品将前i-1中重量为w[i]的物品替换)的最大值,
35         for(int i=1;i<n;i++) {
36             
37             for(int j=0;j<=m;j++) {
38                 
39                 dp[i][j]=Integer.max(dp[i-1][j],dp[i][j]);
40                 
41                 if(j-w[i]<=0) {
42                     
43                     continue;
44                     
45                 }
46                 
47                 dp[i][j]=Integer.max(dp[i][j], dp[i-1][j-w[i]]+v[i]);
48                 
49             }
50             
51         }
52         
53         //背包的最大价值为:背包容量为0到m之中的最大值
54         int maxValue=0;
55         for(int i=0;i<=m;i++) {
56             
57             maxValue=Integer.max(dp[n-1][i], maxValue);
58             
59         }
60         
61         System.out.println(maxValue);
62 
63     }
64 
65 }
原文地址:https://www.cnblogs.com/xuzhiyuan/p/7788318.html