01背包问题(Java实现)

关于背包问题,百度文库上有崔添翼大神的《背包九讲》,不明的请移步查看。这里仅介绍最基本的01背包问题的实现。

 1 public class Knapsack {
 2     private final int MIN = Integer.MIN_VALUE;
 3
 4     @org.junit.Test
 5     public void test() {
 6         int[] w = {3, 2, 2};
 7         int[] v = {5, 10, 20};
 8         knapsackOptimal(5, w, v);
 9     }
10
11     /**
12      * 01背包-容量压缩
13      *
14      * @param c      包容量
15      * @param weight 各物品质量
16      * @param value  各物品价值
17      */
18     public void knapsackOptimal(int c, int[] weight, int[] value) {
19         int n = weight.length; //物品数量
20         int[] w = new int[n + 1];
21         int[] v = new int[n + 1];
22         int[][] G = new int[n + 1][c + 1];
23         for (int i = 1; i < n + 1; i++) {
24             w[i] = weight[i - 1];
25             v[i] = value[i - 1];
26         }
27
28         //初始化values[0...c]=0————在不超过背包容量的情况下,最多能获得多少价值
29         //原因:如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了
30         int[] values = new int[c + 1];
31         //初始化values[0]=0,其它全为负无穷————解决在恰好装满背包的情况下,最多能获得多少价值的问题
32         //原因:只有容量为0的背包可以什么物品都不装就能装满,此时价值为0,其它容量背包均无合法的解,属于未定义的状态,应该被赋值为负无穷
33         /*for (int i = 1; i < values.length; i++) {
34             values[i] = MIN;
35         }*/
36
37         for (int i = 1; i < n + 1; i++) {
38             for (int t = c; t >= w[i]; t--) {
39                 if (values[t] < values[t - w[i]] + v[i]) {
40                     values[t] = values[t - w[i]] + v[i];
41                     G[i][t] = 1;
42                 }
43             }
44         }
45         System.out.println("最大价值为: " + values[c]);
46         System.out.print("装入背包的物品编号为: ");
47         /*
48         输出顺序:逆序输出物品编号
49         注意:这里另外开辟数组G[i][v],标记上一个状态的位置
50         G[i][v] = 1:表示物品i放入背包了,上一状态为G[i - 1][v - w[i]]
51         G[i][v] = 0:表示物品i没有放入背包,上一状态为G[i - 1][v]
52         */
53         int i = n;
54         int j = c;
55         while (i > 0) {
56             if (G[i][j] == 1) {
57                 System.out.print(i + " ");
58                 j -= w[i];
59             }
60             i--;
61         }
62     }
63 }

THE END.

时间: 2024-08-02 15:15:08

01背包问题(Java实现)的相关文章

01背包问题JAVA实现

在刷华为机试的在线编程,碰到一个类似01背包问题的题目,综合了一些资料,写一些自己的理解 01背包问题就是在有限的称重容量下,求最大价值的问题 假设几个参数: w[i]:第i个物品的重量: p[i]:第i个物品的价值: v[i][j]:表示在前i个物品中,总重量为j时的最大价值: v[i-1][j-w[i]]:表示前i-1个物品中,加入第i个物品后的承重容量下的最大价值: 我们分析:在加入第i件物品前,我们要考虑要不要加进去,不加进去,那么就是v[i][j]=v[i-1][j]:如果加进去,那么

动态规划之01背包问题(最易理解的讲解)

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻. 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ? 题目描述: 有编号分别为a,b

10.动态规划(3)——0-1背包问题

在上一篇<9.动态规划(2)——子集和问题>中,谈到了什么是子集和问题,以及实现.背包问题实际也是子集和问题的一种,不过背包问题不是“判断问题”而是一个“最优问题”.而背包问题实际上又分为“0-1背包”,“完全背包”,本文对“0-1背包”进行讲解. 问题:有n个物品,每个物品的重量为weigh[i],每个物品所对应的价值为price[i],现在有一个背包,背包所能承受的重量为W,问背包能装下的物品总价值最大是多少? 定义s[i, j]表示前i个物品的总价值,j为背包的承重量.当j = W或者最

杭电 oj2602~(0-1背包问题)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 51417    Accepted Submission(s): 21634 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bon

动态规划求解0-1背包问题

0-1背包问题是: 一个背包能承受的最大容量为max_weight,  现在有n个物品, 它们的重量分别是{w1,w2,w3,......wn}, 和价值分别是{v1,v2,......vn}, 现在要求在满足背包装载的物品不超过最大容量的前提下,保证装载的物品的价值最大? 动态规划求解过程可以这样理解: 对于前i件物品,背包剩余容量为j时,所取得的最大价值(此时称为状态3)只依赖于两个状态. 状态1:前i-1件物品,背包剩余容量为j.在该状态下,只要不选第i个物品,就可以转换到状态3. 状态2

0-1背包问题的动态规划实现

一,问题描述 给定一个背包,已知背包的最大承重为packageWeight,再给出若干件(numbers件)物品,已经每件物品的重量和对应的价值. 物品的重量存储在weight[]数组中,物品的价值存储在value[]数组中. 现在要求:应该挑选哪几件物品,使得背包装下最大的价值(注意:装的物品的重量不能超过背包的承重) (本文在最后打印出了装入了哪几件物品) 二,问题分析 这是一个典型的动态规划求解.对于每件物品而言,只有两种选择,要么选中它装入背包:要么不选它.因此,这是一个0-1背包问题,

动态规划专题 01背包问题详解 HDU 2546 饭卡

我以此题为例,详细分析01背包问题,希望该题能够为初学者对01背包问题的理解有所帮助,有什么问题可以向我提供,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14246    Accepted Submission(s): 4952 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即

动态规划(一)01背包问题

题目描述: 有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和? 状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } 1 import java.util.Arrays; 2 3 public class Dp { 4 public static void main(String[] args) {

01背包问题:POJ3624

背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们的数组基于这样一种假设: totalN表示物品的种类,totalW表示背包的容量 w[i]表示第i件物品的重量,d[i]表示第i件物品的价值. F(i,j)表示前i件物品放入容量为j的背包中,背包内物品的最大价值. F(i,j) = max{ F(i-1,j) , F(i-1,j-w[i])+d[i