C语言分支限界法求解01背包问题

分支限界法是一种求解优化问题的算法,针对01背包问题,它可以通过在搜索过程中剪枝,减少搜索空间的大小,提高算法的效率。

具体来说,分支限界法会将当前状态下的可行解集合分成若干个子集,每个子集代表一条搜索路径,然后根据某种启发式策略(如最大价值优先、最小重量优先等)对这些子集进行排序,选择价值最大/重量最小的子集进行扩展,将其分成若干个子集,再重复上述过程,直到找到最优解或者搜索结束。

在求解01背包问题时,分支限界法每次扩展节点时,会判断当前节点能否产生更优的解,如果不能,就进行剪枝,减少搜索空间。例如,如果当前节点已经超出了背包的容量限制,就可以直接剪枝,不再继续扩展。在搜索过程中,分支限界法还会维护一个上界,即当前可行解集合中的最优解,如果当前节点的下界已经小于上界,也可以直接剪枝,不再继续扩展。

分支限界法是一种高效、精确的求解优化问题的算法,但需要注意的是,它并不保证一定能找到最优解,因为搜索空间较大时,其时间复杂度可能会非常高。

代码:

#include <stdio.h>
#include <stdlib.h>#define MAX_N 1000  // 最大物品数量
#define MAX_W 1000  // 最大背包容量int n;  // 物品数量
int w[MAX_N];  // 物品重量
int v[MAX_N];  // 物品价值
int c;  // 背包容量
int maxv;  // 最大价值
int curw;  // 当前背包重量
int curv;  // 当前背包价值
int bestv[MAX_W];  // bestv[i]表示当前索引为i时,背包容量为i时的最大价值// 计算以j为索引、背包容量为c的情况下,能够获得的最大价值
int bound(int j, int c) {int b = curv;int leftw = c - curw;while (j < n && leftw >= w[j]) {leftw -= w[j];b += v[j];j++;}if (j < n) {b += leftw * v[j] / w[j];}return b;
}// 搜索第i个物品是否放入背包
void dfs(int i) {if (i == n) {  // 达到叶子节点,更新最大价值maxv = curv;return;}// 不选第i个物品bestv[i+1] = bound(i+1, c);  // 计算下一个物品的最大价值if (bestv[i+1] < maxv) {  // 如果最大价值都小于当前最大价值,直接返回return;}dfs(i+1);// 选第i个物品if (curw + w[i] <= c) {  // 可以放入背包curw += w[i];curv += v[i];if (curv > maxv) {  // 更新最大价值maxv = curv;}bestv[i+1] = bound(i+1, c);  // 计算下一个物品的最大价值if (bestv[i+1] > maxv) {  // 如果最大价值比当前最大价值大,继续搜索dfs(i+1);}curw -= w[i];  // 回溯curv -= v[i];}
}int main() {// 读入数据scanf("%d%d", &n, &c);for (int i = 0; i < n; i++) {scanf("%d%d", &w[i], &v[i]);}// 初始化maxv = curv = 0;curw = 0;bestv[0] = bound(0, c);// 搜索dfs(0);// 输出结果printf("%d\n", maxv);return 0;
}

分支限界法的思路如下:

  1. 按照某种规则先对问题求出一个下界,把问题分成可行和不可行两种情况。对于可行的情况,可以计算出对应的最优解的上界(贪心法、动态规划等)。
  2. 依次搜索所有可能的解,在搜索过程中,利用计算出的上界剪枝,即当某个节点的上界小于当前最优解时,可以直接返回上一层,省略掉这个分支。
  3. 在搜索过程中,记录当前的最优解,并不断更新。当达到叶子节点,即搜索结束时,返回最优解。

对于01背包问题,每个节点有两种情况,即选或不选当前物品。对于每个节点,可以计算出剩余物品的最大价值,从而计算出当前节点可以达到的最大价值(上界)。用一个数组bestv记录每个节点的最大价值,如果当前节点的上界小于当前最优解,直接返回;如果当前节点的最大价值比当前最优解大,继续搜索。在搜索过程中,使用变量curwcurv记录当前的背包重量和价值,变量maxv记录当前的最大价值。

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

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

相关文章

Java特殊文件读取案例Properties

代码 package com.itheima.d1;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.util.Properties;public class Test3 {public static void main(String[] args) throws Exception {//目标&#xff1a;读取属性文件…

SpringBoot通过@Scheduled实现定时任务

Spring自带的定时任务系统&#xff0c;使用注解时必须指定任意一个参数&#xff08;属性&#xff09;&#xff1a;cron、fixedDelay或fixedRate&#xff1b; 1. 启动类添加开启注解 EnableScheduling 2. cron参数 /** * cron 一共可以有7个参数 以空格分开 其中年不是必须参…

java项目之品牌银饰售卖平台(ssm+vue)

项目简介 主要功能包括首页、个人中心、用户管理、促销活动管理、饰品管理、我的收藏管理、系统管理、订单管理等。管理员模块: 管理员可以查询、编辑、管理每个用户的信息和系统管理员自己的信息&#xff0c;同时还可以编辑、修改、查询用户账户和密码&#xff0c;以及对系统…

EMG肌肉电信号处理合集(三)

本文主要展示常见的肌电信号预处理的实现&#xff0c;开发环境为matlab。 目录 1 肌电信号低通&#xff0c;高通&#xff0c;带通滤波 2 去除DC 0阶偏置&#xff0c;1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通&#xf…

pdf.js插件怎么控制工具栏的显示与隐藏

最近做了一个需求&#xff0c;需要实现pdf文件的预览&#xff0c;但是只是提供预览功能&#xff0c;不需要展示相关的工具栏&#xff0c;所以需要把工具栏隐藏掉。我用的插件是pdf.js 官网地址&#xff1a;http://mozilla.github.io/pdf.js/ 中文文档地址&#xff1a;https://…

邻趣连接力:如何无代码集成CRM、电商平台和营销系统,提升广告推广效率

连接即服务&#xff1a;邻趣无代码集成方法 传统的电商系统集成过程需要大量的时间和资源进行API开发&#xff0c;这不仅耗时耗力&#xff0c;还需要专业的技术团队支持。然而&#xff0c;邻趣通过提供一种无需API开发的连接方法&#xff0c;极大地简化了整个集成过程。商家只…

vue3 滚动条回到顶部

需求&#xff1a; 在页面a&#xff0c;滑动了滚动条&#xff0c;再进入页面b&#xff0c;但是页面B记录了滚动条位置 现在想要&#xff0c;进入页面B,不记录之前的滚动条&#xff0c; 代码 //页面B <div class"center" ref"centerRef">页面B </…

信号...

信号的产生&#xff1a;外卖小哥给我打电话说你外卖到了 信号的保存&#xff1a;我可能正在推高地&#xff0c;脑子里面记住我外卖到了&#xff0c;一会再去拿 信号的处理&#xff1a;我打完了&#xff0c;下楼把外卖拿了 完成了一次信号的生命周期

VSDX Annotator v1.16.1(Visio 绘图注释工具)

VSDX Annotator是一款在Mac上操作MSVisio绘图的工具&#xff0c;提供了广泛的注释可能性&#xff0c;以及在多平台环境中共享可视文档。它确保共有12个注释工具&#xff0c;并允许添加注释、标注、注释、块、图形文件等。该应用程序允许用户在Mac上查看Visio流程图、图表、方案…

Cartographer实现双雷达建图

Urdf修改 <?xml version="1.0" ?> <robot name="robot"><link name="base_link" /><link name="laser_1" /><link name="laser_2" /><link name="laser_link" /><join…

13.什么是Spring beans?

什么是Spring beans&#xff1f; Spring 官方文档对 bean 的解释是&#xff1a; In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assem…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次&#xff08;at least once&#xff09;3.2 至多一次&#xff08;ai most once&#xff09;3.3 恰好一次&…

边海防可视化智能视频监控与AI监管方案,助力边海防线建设

一、背景与需求 我国有3万多公里的边境线和海岸线&#xff0c;随着我国边海防基础设施建设的快速发展&#xff0c;边海安防也逐渐走向智能化。传统人工巡防的方式已经无法满足边海智能化监管的需求&#xff0c;在沿海、沿边地区进行边海智慧安防视频监控系统等边海防基础设施建…

智慧海岛/海域方案:助力海洋空间智慧化、可视化管理

随着我国海洋经济的快速发展&#xff0c;海域海岛的安防技术也获得了进步。传统的安防监控模式已经满足不了海域海岛的远程监管需求。伴随着人工智能、边缘计算、大数据、通信传输技术、视频技术、物联网等信息化技术的发展&#xff0c;海岛海域在监管手段上&#xff0c;也迎来…

【Spring Cloud实战】分布式系统控制与组件应用

在现代软件开发中&#xff0c;分布式系统已经成为一种常见的架构模式&#xff0c;被广泛应用于各种规模的企业和组织中。这种架构模式通过将应用程序拆分为独立的组件&#xff0c;并分布在不同的计算机节点上运行&#xff0c;使得系统能够应对高负载和大规模的数据处理需求&…

python tkinter使用(四)

本篇文章主要讲下tkinter 的文本框相关. tkinter中用Entry来实现输入框,类似于android中的edittext. 具体的用法如下: 1:空白输入框 如下: name tk.Entry(window) name.pack()2: 设置输入框的默认文案 name tk.Entry(window) name.pack() name.insert(tk.END, "请…

使用支付宝的沙箱环境在本地配置模拟支付并发布至公网调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问9. 结语 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙…

vue .prop修饰符

一、官网概念 .prop - 强制绑定为 DOM property 原本自定义属性默认会绑定在DOM的attributes上&#xff0c;加上prop之后会绑定在property&#xff0c;attributes上就不存在咯 在页面上的一个明显区别就是&#xff1a;不加prop时&#xff0c;DOM渲染后自定义属性和值都是暴露在…

自定义label组件

自定义label组件 支持边框绘制 支持shape背景(按指定圆角裁剪,矩形,圆角矩,圆形),支持指定角圆角 支持自定义阴影(颜色,偏移,深度) 边框颜色支持状态选择器 预览 核心绘制辅助类 public class LabelHelper {private final Paint paint;private Paint shadowPaint;private fina…

【无标题】学习HTML

由于工作需求&#xff0c;学习了一些html的相关知识&#xff0c;最终应用到打印功能上使用。 HTML是指超文本标记语言&#xff08;HyperText Markup Language&#xff09;。它是一种用于创建和呈现互联网上页面的标准标记语言。HTML是Web开发的基础&#xff0c;是构建网页和应…