zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    慕课网-安卓工程师初养成-2-6 Java中的数据类型
    慕课网-安卓工程师初养成-2-5 如何命名Java变量
    慕课网-安卓工程师初养成-2-4 变量是什么
    慕课网-安卓工程师初养成-2-3 练习题
    慕课网-安卓工程师初养成-2-2 认识Java标识符
    慕课网-安卓工程师初养成-2-1 Java中的关键字
    慕课网-安卓工程师初养成-1-10 练习题
    Java编程——万年历
    排队购票
    猴子爬山
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/7788318.html
Copyright © 2011-2022 走看看