回溯法:0-1背包问题

问题描述

给定n种物品和一背包。 物品i的重量是w_i, 其价值为v_i,背包的容量为 c。 问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?注意物品不重复!

实例:物品价值V={12, 11, 9, 8}, 物品重量W={8, 6, 4, 3}, 背包容量c=13

结点:向量(x_1,x_2,...,x_k) ( 子集的部分特征向量)

搜索空间: 子集树2^n片树叶

其中两个可行解为:

<0,1,1,1>:x_1=0,x_2=1,x_3=1,x_4=1\\ <1,0,1,0>:x_1=1,x_2=0,x_3=1,x_4=0

回溯法模版回顾 

参考文章:代码随想录

回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!

因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

实现代码

终止条件代码

public static void backtracking(int n,  int startIndex) {if (startIndex>=n){//此时startIndex越界了if (getPathSum()<=c){result.add(new ArrayList<>(path));return;}return;}//再加后面任意一个就肯定不够了if (getPathSum()<=c&&(getPathSum() + items_min_weight[startIndex]) > c) {//        if (getPathSum()<c) {result.add(new ArrayList<>(path));return;}for (int i = startIndex; i < n; i++) {path.add(i);backtracking(n,  i + 1);path.removeLast();}

最终代码(含注释)

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class KnapsackProblem {static List<List<Integer>> result = new ArrayList<>();static LinkedList<Integer> path = new LinkedList<>();static int N = 4;//    static int[] items_weight = new int[N];static int[] items_weight = {8, 6, 4, 3};//    static int[] items_value = new int[N];static int[] items_value = {12, 11, 9, 8};//每个items_min_weight(对应下标为i)的值为min{items_weight[i],...,items_weight[N-1]}static int[] items_min_weight = new int[N];//c为背包的容量static int c=13;public static void main(String[] args) {items_min_weight[N - 1] = items_weight[N - 1];int min = items_min_weight[N - 1];for (int i = items_weight.length - 2; i >= 0; i--) {if (items_weight[i] < min) {min = items_weight[i];}items_min_weight[i] = min;}backtracking(N,  0);System.out.println("可行解有:");result.forEach(System.out::println);//要是想求最优解,直接对每个可行解对应重量求和,之后取最大一个就好啦}public static void backtracking(int n,  int startIndex) {if (startIndex>=n){//此时startIndex越界了if (getPathSum()<=c){result.add(new ArrayList<>(path));return;}return;}//再加后面任意一个就肯定不够了if (getPathSum()<=c&&(getPathSum() + items_min_weight[startIndex]) > c) {//        if (getPathSum()<c) {result.add(new ArrayList<>(path));return;}for (int i = startIndex; i < n; i++) {path.add(i);backtracking(n,  i + 1);path.removeLast();}}public static int getPathSum() {int sum = 0;for (int i = 0; i < path.size(); i++) {sum += items_weight[path.get(i)];}return sum;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写Vue3源码

Vue3核心源码 B站视频地址&#xff1a;https://www.bilibili.com/video/BV1nW4y147Pd?p2&vd_source36bacfbaa95ea7a433650dab3f7fa0ae Monorepo介绍 Monorepo 是管理项目代码的一种方式&#xff0c;只在一个仓库中管理多个模块/包 一个仓库可以维护多个模块&#xff0c;…

Java API集合(2)

1.时间日期类 1.1 Date类&#xff08;应用&#xff09; 计算机中时间原点 1970年1月1日 00:00:00 时间换算单位 1秒 1000毫秒 Date类概述 Date 代表了一个特定的时间&#xff0c;精确到毫秒 Date类构造方法 方法名说明public Date()分配一个 Date对象&#xff0c;并初始化…

Fog-Aware Adaptive YOLO for Object Detection in Adverse Weather

Abstract 提出了一种雾自适应YOLO算法。使用一种雾评估算法将图片分为有雾和无雾图片&#xff0c;随后将标准的YOLO应用于正常图片&#xff0c;自适应YOLO应用于有雾图片。 Method 目前的除雾方法去除雾霾时不考虑其雾度和发生频率。例如&#xff0c;图像自适应YOLO算法[6]试…

大数据小白初探HDFS从零到入门(一)

目录 1. 前言 2. 大数据的诞生 3.发展趋势及应用 4.离线计算和实时计算 5.大数据的特性 1. 前言 前两天把Hbase的初级入门知识整理了下,在文章中提到了“HDFS”这个大数据的基础,有同事小伙伴想要了解下这方面的知识,今天我把之前整理的内容也给同事讲了下,顺便我把他…

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址&#xff08;含历史版本&#xff09;&#xff1a;https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1&#xff0c;安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料&#xff08;Qt C…

二叉树的基本操作

二叉树的基本操作 前文对二叉树的递归遍历作了一定的介绍&#xff0c;本文中我们继续深入理解递归&#xff0c;实现二叉树的基本操作。 1、获取树中结点个数 对于这个问题&#xff0c;我们有两种解决的思路。 1、子问题思路 我们通过结点左字树和右字树的结点总数加1来计算…

机器视觉检测设备在连接器外观缺陷检测中的应用

作为传输电流或信号连接两个有源器件的器件&#xff0c;连接器被广泛应用于各个行业&#xff0c;从手机、平板、电脑&#xff0c;到冰箱、空调、洗衣机&#xff0c;再到汽车、国防、航空&#xff0c;处处是它的所在。每个电子产品少了连接器将无法运作&#xff0c;因此&#xf…

20个超实用的JavaScript高级技巧

1.Intersection Observer: 用途&#xff1a; 监听元素与其父元素或视口的交叉情况。使用场景&#xff1a; 懒加载图片、实现无限滚动。 const callback (entries, observer) > {entries.forEach(entry > {if (entry.isIntersecting) {console.log(Element is in the v…

Python——面向对象案列

1. class User(object):#重写__int__初始化方法&#xff0c;该方法用来初始化属&#xff0c;在构建方法的时候&#xff0c;这个方法会自动触发&#xff0c;用来初始化属性def __init__(self): #name “” 这是一个局部变量#self类似指针 this#self.name类的属性print("构…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

K8S--部署Nacos

原文网址&#xff1a;K8S--部署Nacos-CSDN博客 简介 本文介绍K8S部署Nacos的方法。Nacos版本是&#xff1a;2.2.3。 部署方案 本文为了简单&#xff0c;使用此部署方式&#xff1a;使用本地pvconfigmap&#xff0c;以embedded模式部署单机nacos。以nodePort方式暴露端口。 …

linux Vim编辑器使用以及文件权限修改,kill process

选择编辑器&#xff1a;select-editor vim命令 基本操作 1.vim 文件名 &#xff1a;进入一般模式&#xff08;不能输入&#xff09; 2.按下 i 从一般模式&#xff0c;进入到插入编辑模式 3.按下esc从插入模式&#xff0c;退出到一般模式 4.输入:wq,退出编辑。 普通模式下&…

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

QT+OSG/osgEarth编译之八十:ive+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ive)

文章目录 1、osgdb_ive介绍2、文件分析3、pro文件4、编译实践1、osgdb_ive介绍 通过osgdb_ive,OpenSceneGraph开源库能方便地读取ive格式的三维文件。 ive(Interchangeable Virtual Environment)是一种三维图形数据交换格式,主要用于虚拟现实和增强现实领域的场景数据交…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

ffmpeg 常用命令行详解

概述 ffmpeg 是一个命令行音视频后期处理软件 1. 裁剪命令 参数说明 -i 文件&#xff0c;orgin.mp3 为待处理源文件-ss 裁剪时间&#xff0c;后跟裁剪开始时间&#xff0c;或者开始的秒数-t 裁剪时间output.mp3 为处理结果文件 ffmpeg -i organ.mp3 -ss 00:00:xx -t 120 o…

c语言-位段

文章目录 前言一、位段是什么&#xff1f;1.1 位段的声明 总结 前言 本篇文章介绍c语言的位段。 一、位段是什么&#xff1f; 概念&#xff1a;c语言允许在一个结构体中以位为单位来指定其成员所占内存长度。 1.1 位段的声明 位段的声明格式为&#xff1a; struct struct_…

速盾网络:香港cdn免备案搭建网站好吗

随着互联网的发展&#xff0c;网站建设已经成为许多企业的必备工具。然而&#xff0c;在中国大陆地区&#xff0c;建立网站需要进行备案申请&#xff0c;这给部分企业带来了不小的困扰。为了解决这一问题&#xff0c;一些企业开始寻找免备案的解决方案&#xff0c;而香港CDN免备…

Webpack5入门到原理12:处理 Html 资源

1. 下载包 npm i html-webpack-plugin -D 2. 配置 webpack.config.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin");module.expo…

无刷电机学习-原理篇

一、无刷电机的优点 使用一项东西首先就要明白为什么要使用它&#xff0c;使用它有什么优点。与有刷电机相比无刷电机除了控制繁琐几乎全是优点。 1、应用范围广&#xff1a;家用电器&#xff08;冰箱空调压缩机、洗衣机、水泵等&#xff09;、汽车、航空航天、消费品工业自动…