用动态规划解01背包(java版)
来源:互联网 发布:政务大数据平台 编辑:程序博客网 时间:2024/06/08 20:08
解题思路的大致步骤:
1、输入信息
2、初始化dp
3、在dp矩阵中计算最优值
4、利用最优值构造最优解
5、输出信息
建议大家可以把下面的代码直接复制并粘贴到编译器就可以运行了。
下面代码的测试用例
import java.util.Scanner;/** * * @author he * */public class Knapsack01 { int numOfObject; //待装载的总物品数 int[] weight; //待装载的重量数组 int[] value; //待装载的价值数组 int maxWeightOfKnapsack; //背包的最大重量 int[][] dp; //dp背包 int[] x; //存储最优解的数组 //输入信息 public void InputInfo(){ Scanner in = new Scanner(System.in); System.out.println("请输入待装载的总件数:"); numOfObject = in.nextInt(); System.out.println("请输入包能装载的最大重量:"); maxWeightOfKnapsack = in.nextInt(); System.out.println("请依次输入待装载包重量:"); weight = new int[numOfObject]; for (int i=0; i<numOfObject; i++){ weight[i] = in.nextInt(); } System.out.println("请依次输入待装载包价值:"); value = new int[numOfObject]; for (int i=0; i<numOfObject; i++){ value[i] = in.nextInt(); } x = new int [numOfObject]; dp = new int[numOfObject+1][maxWeightOfKnapsack+1]; in.close(); } //用动态规划的方法构造dp矩阵 public void knapsack(){ //1、初始化dp for (int i=weight[1]; i<=maxWeightOfKnapsack; i++){ dp[1][i] = value[0]; } //2、构造dp for (int i=1; i<=numOfObject; i++){ for (int j=1; j<=maxWeightOfKnapsack; j++){ if (j < weight[i-1]){ dp[i][j] = dp[i-1][j]; } else if(j >= weight[i-1]){ dp[i][j] = Math.max(dp[i-1][j], value[i-1]+dp[i-1][j-weight[i-1]]); } } } } //打印dp public void printDP(){ System.out.println("能装载的最大重量为:" + dp[numOfObject][maxWeightOfKnapsack]);/* //当你需要打印dp矩阵的时候,直接取消注释就可以了 * for (int i=0; i<=numOfObject; i++){ for (int j=0; j<=maxWeightOfKnapsack; j++){ System.out.print(dp[i][j] + " "); } System.out.println(); }*/ System.out.println("最优解为:"); for (int i=0; i<numOfObject; i++){ System.out.print(x[i] + " "); } } //用回溯法构造最优解 public void traceback(){ int temp = maxWeightOfKnapsack; for (int i=1; i<=numOfObject; i++){ if(dp[i][temp] == dp[i-1][temp]){ x[i-1] = 0; }else{ x[i-1] = 1; temp -= weight[i-1]; } } } public static void main(String[] args) { Knapsack01 knap = new Knapsack01(); //录入信息 knap.InputInfo(); //构造dp,递归构造最优值 knap.knapsack(); //利用最优值回溯构造最优解 knap.traceback(); //打印数据 knap.printDP(); }}
阅读全文
0 0
- 用动态规划解01背包(java版)
- 01背包 Java 动态规划
- (动态规划)01背包
- 一步一步看清动态规划----背包问题(java解)
- 动态规划解决01背包问题(java实现)
- Java动态规划01背包问题
- 01背包动态规划-java源码
- 蓝桥杯-01背包-动态规划-java
- 01背包-动态规划-Java实现
- 动态规划之背包问题(JAVA)
- 动态规划总结(01背包 完全背包 多重背包)
- 动态规划初步( 01 背包、完全背包、多重背包)
- 动态规划背包算法(01背包和完全背包)
- 动态规划 01背包
- 01背包-动态规划
- 01背包动态规划
- 01背包 动态规划
- 01背包动态规划
- 坐标系之间的旋转平移变换与对应变换矩阵的关系
- java开发环境搭建
- Python机器学习中的实用小操作(一):数据清理篇 阿萨姆 2 个月前 0. 背景 很多朋友评论希望我共享答案和文章中提到的操作代码,比如生成相关性图谱等。为了方便大家,开始介绍一些虽然简单但很有用
- 快速幂算法
- AngularJS:模糊查询过滤内容,验证判断后添加表格信息
- 用动态规划解01背包(java版)
- 反射机制获取Class对象的三种方式:
- 20170608
- void main()和int main()
- windows远程桌面连接到Linux服务器(ubuntu系统)以及解决xrdp登录界面port问题
- [知了堂学习笔记]_jQuery Ajax
- linux 安装MySql 5.7.20
- mybatis官网参考文档-XML配置_typeHandlers(版本: 3.4.6-SNAPSHOT)
- 从文本中构建词向量