回溯法实现01背包问题

C语言实现回溯法解决01背包问题 01背包问题(0/1 Knapsack Problem)是组合优化中的一个经典问题,广泛应用于资源分配、任务调度等领域。它涉及到如何在限定的背包容量下,选择一定数量的物品使得总价值最大,同时不超过背包的承载能力。在一个给定的总重量限制W下,有n个物品,每个物品都有自己的重量和价值。问题的目标是确定哪些物品应该被选入背包,以使背包中物品的总价值最大,同时不超过背包的总重量限制。回溯法,也称为回溯搜索法,是一种通过探索所有可能的候选解来找出所有解的算法。 阅读详情

                     回溯法实现01背包问题(递归版)

    老师今天让我们上机实验做这个,还是有点把握的。毕竟认真听课了嘛。回溯法其实就是套公式(个人理解)。

  来自清华大学出版社的《算法与分析》的解题步骤

   (1) 针对所给问题,定义问题的解空间;

   (2)确定易于搜索的解空间结构(解空间树);

   (3)以深度优先的方式搜索解空间树,并且在搜索过程中用剪枝函数避免无效搜索;

 

直接贴代码了,里面有较为详细的注释~

 

package bag;

import java.text.DecimalFormat;
import java.util.Arrays;

public class bagTest {
     public static void main(String []args){
         double c=20;
           int n=10;
           double []weight={5,5,3,4,5,1,2,4,3,2};
           double []value={5,4,3,2,1,10,1,5,4,3};
          
          /* double []weight=new double[n];
           double []value=new double[n];
           
           for(int i=0;i<n;i++){
               普通双精度随机数
               * double random1=Math.random()*100;
              double random2=Math.random()*100;  
               //只有两位小数的双精度数
              double random1=(double)Math.round((Math.random()*10+1)*100)/100;
              double random2=(double)Math.round((Math.random()*10+1)*100)/100;
              weight[i]=random1;
              value[i]=random2;
           }*/
           
           bag b=new bag(c,n,weight,value);
           
       }
}

class bag{
    
    private double c;
    private int n;
    
    private double []weight;
    private double []value;
    
    //存储排序后的编号
    private int []x;
    //最终选择的物品组
    private StringBuffer result;
    
    //完整解(最大价值)
    private double max;
    //部分解(当前最大值)
    private double pv;
    //当前重量
    private double pw;
 
    
    public bag(double c ,int n,double []weight, double []value){
         this.c=c;;
         this.n=n;
         this.weight=weight;
         this.value=value;
        
         x=new int[n];
         result=new StringBuffer();
         max=0;
         pv=0;
         pw=0;

         sort();
         backtrack(0);
  

基于回溯法的01背包问题C语言实现与优化 回溯法不仅仅是一个算法,它体现了一种系统性的试错哲学大胆尝试,及时止损,保留退路,持续逼近最优。这不仅是编程思维,更是解决问题的普适方法论。当你面对复杂选择时,不妨问问自己:- 我能不能枚举所有可能?- 哪些路径明显走不通?- 能不能预测未来的潜力?- 是否能在早期就做出明智放弃?这些问题的答案,往往就是通向高效的钥匙 🔑而这一次,我们不仅实现了01背包的回溯求解,还亲手打造了一个兼具正确性、效率与可维护性的完整系统。 阅读详情

相关推荐

Fritzing0.9.10下载安装和简单使用

Fritzing 作为一款电子设计自动化软件,其画图用于导入到论文和文档,清晰好看,能解决用相机拍实物照片杜邦线很乱的痛点。

李同学Lino的博客 3万+

树莓派与无人机协同实战:基于OpenCV的地标识别优化策略

本文深入探讨了基于树莓派与无人机的协同系统,重点分享了利用OpenCV优化地标识别以实现精准降落的实战策略。内容涵盖从应对复杂光照的图像预处理、鲁棒的轮廓几何过滤,到通过ROS进行稳定通信,以及实现分层控制与状态机设计,旨在提升系统在真实环境中的可靠性与性能。

y2z3a4b5c的博客 1086

R语言:基于Spatstat包的单变量和双变量平面Ripley‘s K函数分析

因为网上查找得到的R语言K函数分析的资料很少,Spatstat包的介绍也很少,所以抛砖引玉。本文简单介绍了使用R语言spatstat包的Kest,Kcross(Lcross)和Kinhom方法进行了单变量和双变量平面Ripley's K函数分析的方法及代码,希望有所帮助。

hsdcmax的博客 1万+

stm32 Can通讯过滤器寄存器设置(实验验证)

起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。 解决: 在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:type

u013984214的专栏 3288

WPS制作甘特图实操(带图超详细)

一、数据准备 图1 二、添加公式 在表格的E3处添加公式:=IF(C3>=G3,0,IF(C3+D3>=G3,G3-C3,D3)),点击该单元格的右下角。使鼠标箭头变“+”后下拉拖拽,复制该公式。F3处的公式为:=D3-E3,使用相同的拖拽方式复制公式应用,操作完毕如下图3. 图2 图3 三、插入图表 1、选中方框1内容,按住ctrl按键,继续选择2、3列的内容,点击插入全部图表中的条形图,选择2对应的图标样式,生成图6的样式。 点击图6中的3标尺,右击选择数据弹出图8,点击+号选择表格中

m0_49047167的博客 3万+

芯片ATE测试PAT(Part Average Testing)学习总结-20250916

文章摘要:零件平均测试(PAT)是半导体制造中基于统计学的质量控制方法,分为静态和动态两种类型。静态PAT通过预先设定的固定限值(每6-8批次更新)筛选异常芯片,计算采用稳健平均值和四分位间距。动态PAT则根据实时数据调整限值,能更精确识别异常而不误判合格芯片。两种方法均采用"均值±6倍标准差"的计算公式,但动态PAT具有更好的适应性和准确性。该方法通过统计分析提高了芯片产品的质量和可靠性。

歌颂苦难的行为是无耻的; 1190

PTC Creo软件二次开发:使用C++进行Creo二次开发实战

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。由Bjarne Stroustrup在贝尔实验室开发,最初作为C语言的增强版出现,后来发展成为一种独立的语言。C++不仅保留了C语言的高效性和灵活性,还引入了类、模板、命名空间等高级特性,使其成为开发复杂系统和软件的理想选择。

kkchenjj的博客 4042

188、LLC谐振变换器的样机调试实战(EMI测试)

本文分享了LLC谐振变换器EMI调试的实战经验。作者通过300W电源案例,指出LLC的EMI问题主要来自谐振腔共模电流和死区振铃,并提出三板斧解决方案:优化功率回路布局、合理选择共模电感、正确配置X/Y电容。文章详细分析了谐振电容位置、MOSFET走线、变压器屏蔽等关键设计要点,并列举示波器探头、滤波器接地等常见误区。最后强调EMI调试70%依赖布局优化,建议预扫测试、数据记录并保留6dB余量。全文以实际案例贯穿,为LLC电源EMI设计提供了实用指导。

Jack010169的博客 56

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: 离线版android学生管理系统
下一篇: 快排函数
Pabebe
博客等级 码龄11年 130粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值