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实现相关推荐

  1. 0/1背包问题-----回溯法求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  2. 符号三角形问题—回溯算法—java实现

    问题描述: 下图是由14个"+"和14个"-"组成的符号三角形.2个同号下面都是"+",2个异号下面都是"-": 符号三 ...

  3. java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

    文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...

  4. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  5. 回溯算法--LeetCode-78 子集、LeetCode-90 子集Ⅱ

    LeetCode-78 子集 题目链接:https://leetcode-cn.com/problems/subsets/ 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). ...

  6. Python的回溯算法

    traceback algorithm 什么时候用 怎么用 什么时候用 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法. 用回溯算法解决问题的一般步骤: 1. 针对所给问题,定义问题的解空间,它 ...

  7. 回溯算法背包问题(java实现)

    一.回溯算法 回溯算法,建议先看视频,b站搜索与回溯算法1 最经典的题就是全排列问题 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m= ...

  8. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

  9. 第十六章 贪心算法——0/1背包问题

    1.问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi > ...

最新文章

  1. 网闸与防火墙的区别是什么
  2. web程序前后台功能实现_微信定制开发、小程序定制开发可以实现哪些功能?
  3. java中的轮子是什么意思_后端的轮子(一) - java后端开发的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 置信学习:让样本中的“脏数据“原形毕露
  5. couchbase_使用Couchbase分页
  6. Live Maps中国更新-为北京增加实时交通信息
  7. XAMPP 7.3.3 安装
  8. 使用python对文档的所有词组统计
  9. docker打包镜像(实用版)
  10. Unity+JetBrainsRider2020+EmmyLua调试Lua(XLua)
  11. 易经64卦富含的人生哲理
  12. Echarts实现可视化大屏
  13. KDZD608屏蔽服效率测试仪
  14. 小程序获取当前日期和时间
  15. 多模型的ROC曲线绘制
  16. 【深度学习】使用labelImg标注图像
  17. FPGA和CPLD的区别
  18. 软件使用说明网站+IT新闻评论
  19. win7停服安全解决方案--win7系统加固
  20. 使用Qt创建一个时钟

热门文章

  1. 干货分享:大数据可视决策关键技术有哪些?分析篇
  2. case计算机英语,CASE
  3. AV1视频编码标准资源汇总 转载
  4. 【计算机视觉】完整版复习
  5. Top-K Off-Policy Correction for a REINFORCE Recommender System
  6. 记一次,朋友圈9宫格图片分割线效果混账代码的优化
  7. Java应用,如何提高系统健壮性
  8. Linux树莓派综合应用---wiringpi库如何交叉编译
  9. 如何在Vivado创建一个FIFO的IP核并使用ILA工具验证
  10. appnode 接管_为什么django接管了网络