标签:规划 strong 情况下 描述 imp can exti 基本 code
1.问题描述:
给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
输入格式
输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
以后N行每行两个数Wi和Vi,表示物品的重量和价值
输出格式
输出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 }
标签:规划 strong 情况下 描述 imp can exti 基本 code
原文地址:http://www.cnblogs.com/xuzhiyuan/p/7788318.html