Java-01背包问题-动态规划-递归和非递归实现
国际惯例,先上代码,粗略分析:
package com.bag; /**
* Author: lihao
* Date:2017/8/31
* Description:
*/
public class Main {
static int totalweight= 150;
static int N= 5;
static int values[] = {60, 20, 10, 60, 100};
static int weights[] = {20, 30, 50, 60, 80}; public static void main(String[] args) {
System.out.println(bagProblem(N-1,totalweight));
bag01();
}
//递归实现
// i {处理到第i件物品} , j{剩余的空间为j}
public static int bagProblem(int i, int j) { int r = 0;
if(i==-1){
return 0;
}
//如果剩余空间大于所放的物品
if (j>=weights[i]){
int r1 = bagProblem(i-1,j-weights[i]) + values[i]; //放第i件
int r2 = bagProblem(i-1,j);//不放第i件
r = Math.max(r1,r2);
}
return r; }
//非递归
public static void bag01(){
int f[] = new int[totalweight+1];
for (int f1:f){
f1 = 0;
}
for (int i=0;i<N;i++){
int w = weights[i];
int v = values[i];
for (int j= totalweight;j>=w;j--){
f[j] = Math.max(f[j],f[j-w]+v);
}
}
System.out.println(f[totalweight]);
}
}
递归实现思路:
重点是寻找状态转移方程
int r1 = bagProblem(i-1,j-weights[i]) + values[i]; //放第i件
int r2 = bagProblem(i-1,j);//不放第i件
r = Math.max(r1,r2);
非递归实现思想:
建立0-totalweights共total+1大小的数组,用来存放价值。
第一步,先任意拿一个物品,进行遍历存放。
第二步,拿第二个物品,进行存放并且和之前的数据进行对比。存放大值。
以此类推,直至循环完成,取最后一个值,即为最大值。
举例,背包大小为10,物品有3个,重量和价值,分别是:3,4 4,5 5,6
第一次,放3,4,则数组从a[0]到a[10]分别是:
0 0 0 4 4 4 4 4 4 4 4
第二次,放4,5,分别是
0 0 0 4 5 5 5 9 9 9 9
第三次,放5,6,分别是
0 0 0 4 5 6 6 9 10 11 11
循环完毕,a[10] = 11。
Java-01背包问题-动态规划-递归和非递归实现的更多相关文章
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- java扫描文件夹下面的所有文件(递归与非递归实现)
java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...
- 回溯算法 DFS深度优先搜索 (递归与非递归实现)
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
- AJPFX:递归与非递归之间的转化
在常规表达式求值中: 输入为四则运算表达式,仅由数字.+.-.*./ .(.) 组成,没有空格,要求求其值. 我们知道有运算等级,从左至右,括号里面的先运算,其次是* ./,再是+.- : 这样我们就 ...
- C语言实现 二分查找数组中的Key值(递归和非递归)
基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...
- 二叉树之AVL树的平衡实现(递归与非递归)
这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...
- 汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
- C实现二叉树(模块化集成,遍历的递归与非递归实现)
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...
随机推荐
- Solr7部署报错:java.lang.NoSuchMethodError: javax.servlet.ServletInputStream.isFinished()Z
错误信息: Servlet.service() for servlet [default] in context with path [/solr] threw exception [Filter e ...
- Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本
Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...
- 使用Hbase快照将数据输出到互联网区测试环境的临时Hbase集群
通过snapshot对内网测试环境Hbase生产集群的全量数据(包括原始数据和治理后数据)复制到互联网Hbase临时集群.工具及原理: 1) Hbase自带镜像导出工具(snapsho ...
- git初次建立远程仓库问题
git "Could not read from remote repository.Please make sure you have the correct access rights. ...
- DFS:Prime Ring Problem(素数环)
解体心得: 1.一个回溯法,可以参考八皇后问题. 2.题目要求按照字典序输出,其实在按照回溯法得到的答案是很正常的字典序.不用去特意排序. 3.输出有个坑,就是在输出一串的最后不能有空格,不然要PE, ...
- 在VIM 里面编辑和保存
#查看a.sh 的内容 cat a.sh #编辑a.sh的内容 键入i,下面会出现 insert,输入内容之后按下esc会退出编辑模式(此时下面的insert没有了) 再输入:wq保存
- 3 View - Response对象
1. HttpResponse对象:返回数据 from django.http import HttpResponse 在django.http模块中定义了HttpResponse对象的API Htt ...
- jni 调用
Event 0 on null Unexpected event 0 on /storage/emulated/0/Books/null
- 01-Flutter移动电商实战-项目学习记录
一直想系统性的学习一下 Flutter,正好看到该课程<Flutter移动电商实战>的百度云资源,共 69 课时,由于怕自己坚持不下去(经常学着学着就不学了),故采用博客监督以记之. 1. ...
- IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习
2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...