0-1背包问题—回溯算法—java实现
0-1背包问题
【问题描述】
有n种可选物品1,…,n ,放入容量为c的背包内,使装入的物品具有最大效益。
表示
n :物品个数
c :背包容量
p1,p2, …, pn:个体物品效益值
w1,w2, …,wn:个体物品容量
【问题解析】
0-1背包问题的解指:物品1,…,n的一种放法(x1, ···,xn的0/1赋值),使得效益值最大。
假定背包容量不足以装入所有物品:面临选择
【优化原理】无论优化解是否放物品1,优化解对物品2,…,n的放法,相对剩余背包容量,也是优化解。首先给出所需要的变量:
```
private static int[] p;//物品的价值数组
private static int[] w;//物品的重量数组
private static int c;//最大可以拿的重量
private static int count;//物品的个数private static int cw;//当前的重量
private static int cp;//当前的价值
static int bestp;//目前最优装载的价值
private static int r;//剩余物品的价值private static int[] cx;//存放当前解
private static int[] bestx;//存放最终解
```
解空间树:子集树
可行性约束条件:cw + w[t] < c
上界函数:cp + r <= bestp,即如果当前结点满足这个条件时,就可以将该结点的右子树剪去。
[核心算法]
```
/*** 回溯* @param t*/
public static void BackTrack(int t) {if(t>count) {//到达叶结点if(cp>bestp) {for(int i = 1;i<=count;i++) {bestx[i] = cx[i];}bestp = cp;}return;}r -= p[t];if(cw + w[t] <= c) {//搜索左子树cx[t] = 1;cp += p[t];cw += w[t];BackTrack(t+1);cp -= p[t];//恢复现场cw -= w[t];//恢复现场}if(cp + r >bestp) {//剪枝操作cx[t] = 0;//搜索右子树BackTrack(t+1);}r += p[t];//恢复现场
}```
[完整代码]
```
package sort;public class Zero_One {
private static int[] p;//物品的价值数组
private static int[] w;//物品的重量数组
private static int c;//最大可以拿的重量
private static int count;//物品的个数private static int cw;//当前的重量
private static int cp;//当前的价值
static int bestp;//目前最优装载的价值
private static int r;//剩余物品的价值private static int[] cx;//存放当前解
private static int[] bestx;//存放最终解public static int Loading(int[] ww,int[] pp, int cc) {//初始化数据成员,数组下标从1开始count = ww.length - 1;w = ww;p = pp;c = cc;cw = 0;bestp = 0;cx = new int[count+1];bestx = new int [count+1];//初始化r,即剩余最大价格for(int i = 1;i<=count;i++) {r += p[i];}//调用回溯法计算BackTrack(1);return bestp;
}/*** 回溯* @param t*/
public static void BackTrack(int t) {if(t>count) {//到达叶结点if(cp>bestp) {for(int i = 1;i<=count;i++) {bestx[i] = cx[i];}bestp = cp;}return;}r -= p[t];if(cw + w[t] <= c) {//搜索左子树cx[t] = 1;cp += p[t];cw += w[t];BackTrack(t+1);cp -= p[t];//恢复现场cw -= w[t];//恢复现场}if(cp + r >bestp) {//剪枝操作cx[t] = 0;//搜索右子树BackTrack(t+1);}r += p[t];//恢复现场
}public static void main(String[] args) {//测试int[] w1 = {0,15,25,40,20,15,24};int[] p1 = {0,10,5,20,2,14,23};int c1 = 30;Loading(w1,p1,c1);System.out.println("最优装载为:" + bestp);for(int i =1;i<=count;i++) {System.out.print(bestx[i] + " ");}
}
}
“`
[运行示例]
0-1背包问题—回溯算法—java实现相关推荐
- 0/1背包问题-----回溯法求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 符号三角形问题—回溯算法—java实现
问题描述: 下图是由14个"+"和14个"-"组成的符号三角形.2个同号下面都是"+",2个异号下面都是"-": 符号三 ...
- java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题
文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...
- 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...
- 回溯算法--LeetCode-78 子集、LeetCode-90 子集Ⅱ
LeetCode-78 子集 题目链接:https://leetcode-cn.com/problems/subsets/ 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). ...
- Python的回溯算法
traceback algorithm 什么时候用 怎么用 什么时候用 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法. 用回溯算法解决问题的一般步骤: 1. 针对所给问题,定义问题的解空间,它 ...
- 回溯算法背包问题(java实现)
一.回溯算法 回溯算法,建议先看视频,b站搜索与回溯算法1 最经典的题就是全排列问题 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m= ...
- 0/1背包问题——动态规划、回溯、分支限界法对比
0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...
- 第十六章 贪心算法——0/1背包问题
1.问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi > ...
最新文章
- 网闸与防火墙的区别是什么
- web程序前后台功能实现_微信定制开发、小程序定制开发可以实现哪些功能?
- java中的轮子是什么意思_后端的轮子(一) - java后端开发的个人空间 - OSCHINA - 中文开源技术交流社区...
- 置信学习:让样本中的“脏数据“原形毕露
- couchbase_使用Couchbase分页
- Live Maps中国更新-为北京增加实时交通信息
- XAMPP 7.3.3 安装
- 使用python对文档的所有词组统计
- docker打包镜像(实用版)
- Unity+JetBrainsRider2020+EmmyLua调试Lua(XLua)
- 易经64卦富含的人生哲理
- Echarts实现可视化大屏
- KDZD608屏蔽服效率测试仪
- 小程序获取当前日期和时间
- 多模型的ROC曲线绘制
- 【深度学习】使用labelImg标注图像
- FPGA和CPLD的区别
- 软件使用说明网站+IT新闻评论
- win7停服安全解决方案--win7系统加固
- 使用Qt创建一个时钟