《0-1 背包问题》
时间:2022-07-25
本文章向大家介绍《0-1 背包问题》,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
寻找递推关系式,面对当前商品有两种可能性:
第一,包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
第二,还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i)但价值增加了v(i);
由此可以得出递推关系式:
1) j<w(i) V(i,j)=V(i-1,j)
2) j>=w(i) V(i,j)=max{ V(i-1,j),V(i-1,j-w(i))+v(i) }
Java 代码实现
1 package com.zuoyan.packageproblem;
2
3 import java.util.Scanner;
4
5 public class Main {
6
7 public static final int I =100;
8 public static final int J =100;
9 public static int goodCount;
10 public static int capacity;
11 public static int V[][] = new int [I][J];
12 public static int weight[] = new int [I];
13 public static int value [] = new int [I];
14
15
16 public static void main(String[] args) {
17
18 Scanner in = new Scanner(System.in);
19 goodCount = in.nextInt();
20 capacity = in.nextInt();
21
22 for(int i = 1;i<=goodCount;i++)
23 {
24 weight[i] = in.nextInt();
25 value [i] = in.nextInt();
26 }
27
28 int maxValue = FinaMax();
29 System.out.println(maxValue);
30
31 }
32
33 public static int FinaMax(){
34 for(int i = 1;i<=goodCount;i++)
35 {
36 for(int j = 1;j<=capacity;j++)
37 {
38 //分两种情况
39 //1.当前背包容量不能放进当前商品
40 if(weight[i]>j)
41 {
42 V[i][j]=V[i-1][j];
43 }
44 //2.当期背包容量大于当前商品的重量
45 else{
46 //不装当前商品价值最大
47 if(V[i-1][j]>(V[i-1][j-weight[i]]+value[i]))
48 {
49 V[i][j] = V[i-1][j];
50 }
51 //装上当前商品价值最大
52 else{
53 V[i][j] = V[i-1][j-weight[i]]+value[i];
54 }
55 }
56 }
57 }
58 return V[goodCount][capacity];
59 }
60
61 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 地表最强的MySQL安装一键式安装,信不信你下完我就给你装好!附各种Mysql安装失败的解决办法(什么你安装失败了?快来看这个)
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 C Buy Watermelon
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 B so easy
- 萌新不看会后悔的C++基本类型总结(二)
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 A Who is better?
- 树的重心
- PostgreSQL 13:索引并行vacuum
- 『数据库』震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)
- 萌新不看会后悔的C++基本类型总结(一)
- 2019 ICPC 银川网络赛 D. Take Your Seat (疯子坐飞机问题)
- 2019 ICPC 银川网络赛 H. Fight Against Monsters
- 状态压缩DP(大佬写的很好,转来看)
- 2019 ICPC 银川网络赛 F-Moving On (卡Cache)
- 树形结构--二叉树的遍历算法应用(十九)
- POJ1088 滑雪题解+HDU 1078(记忆化搜索DP)