背包问题
2016-05-03 14:12
375 查看
package com.experimental.dongtaiguihua; /* * 01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法。本文仅涉及动态规划。 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。 其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。 最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。 */ public class Backpack { private final int capaticy = 10; private final int number = 3; //声明物品标记数组 private int mark[]; //声明物品的重量数组 private int weight[]; //声明物品的价值数组 private int value[]; //声明保存最大价值的数组 private int [][] maxValue; public Backpack(){ maxValue = new int [number + 1][capaticy + 1]; mark = new int [number + 1]; weight = new int [number + 1]; value = new int [number + 1]; //为每个物品赋初值 weight[1] = 3; value[1] = 4; weight[2] = 4; value[2] = 5; weight[3] = 5; value[3] = 6; //当物品个数为0的时候,背包最大价值为0 for(int i = 0; i <= capaticy; i++){ maxValue[0][i] = 0; } //当背包容量为0的时候,背包最大价值为0 for(int i = 0; i <= number; i++){ maxValue[i][0] = 0; } } public void execute(){ for(int i = 1; i <= number; i++){ for(int j = 1; j <= capaticy; j++){ if(j < weight[i]){ maxValue[i][j] = maxValue[i-1][j]; }else if((maxValue[i - 1][j -weight[i]] + value[i]) > maxValue[i-1][j]){ maxValue[i][j] = maxValue[i - 1][j -weight[i]] + value[i]; }else{ maxValue[i][j] = maxValue[i-1][j]; } } } int j = capaticy; for(int i = number; i >= 1; i-- ){ if(maxValue[i][j] > maxValue[i-1][j]){ j -= weight[i]; mark[i] = 1; } } } public void print(){ for(int i = 1;i <= number; i++){ for(int j = 1; j <= capaticy; j++){ System.out.printf("%-4d", maxValue[i][j]); } System.out.println(); } System.out.println("最大价值为:" + maxValue[number][capaticy]); System.out.print("装入背包的物品为:"); for(int i = 1; i <= number; i++){ if(mark[i] == 1){ System.out.print(i + " "); } } } public static void main(String[] args) { // TODO Auto-generated method stub Backpack backpack = new Backpack(); backpack.execute(); backpack.print(); } }
相关文章推荐
- Android开发中,那些让你相见恨晚的方法、类或接口
- android动画xml参数解析
- HttpClient工具正确使用方式
- centos7.1 安装 svnmanager1.10
- Android Studio进阶使用技巧
- 代理模式
- Request.InputStream 接收Post Data
- centos下安装python mysqldb
- UILabel加下划线
- Zookeeper中的主节点-从节点应用(master-worker)
- 第十一周 阅读程序(2)
- Spring IOC (Bean的载入和注册)
- hibernate 的级联操作 cascade操作
- ScrollView夹在顶部底部控件之间
- Advanced Driver Assistance Systems (ADAS)
- centos查看磁盘扇区大小等信息
- 16进制浮点数
- MongoDB删除文档
- 图像亮度自适应调整
- Harris corner detection