背包问题(回溯法)

背包问题(回溯法)使用回溯法解决背包问题背包问题 较好的解决方法为动态规划 但是在不考虑其时间和计算复杂度的情况下 可以使用回溯法解决 也挺方便 思想 遍历所有的可能结果 不断尝试新的物品 如果总价值大于上一次的总价值 即可更新 bestValue 变量 在不超过总重量的情况下 程序结果 可以输入在当前不超重的情况下的最大价值 上代码 include iostream i iostream

使用回溯法解决背包问题

背包问题,较好的解决方法为动态规划,但是在不考虑其时间和计算复杂度的情况下,可以使用回溯法解决(也挺方便)

思想:

遍历所有的可能结果,不断尝试新的物品,如果总价值大于上一次的总价值,即可更新bestValue变量(在不超过总重量的情况下)

程序结果:

可以输入在当前不超重的情况下的最大价值!

上代码:

#include 
  
    #include 
   
     #include 
    
      using namespace std; //这里解决《背包问题》 extern int lastValue = 0; extern int bestValue = 0; int putIntoBag(int *weight, int *value, int bag, int values, int n, int number, int all) { //重量数组、价值数组、一个空包包、当前包包的价值、要放第几个物品、物品总数、包包总价值 if (bag >= all){ if (lastValue == 0) {//初始化 lastValue = values; bestValue = values; } else { if (values > lastValue) { lastValue = values; bestValue = values; } } return 1; } for (int i = n; i < number; i++) { if ((bag + weight[i]) <= all) { //装进去 bag += weight[i]; values += value[i]; int index = putIntoBag(weight, value, bag, values, i + 1, number, all); if (index) { //回溯 bag -= weight[i]; values -= value[i]; } } } } int main() { int weight[10] = {4,5,7,2,8,3,9,6,1,10};//测试重量 int value[10] = {25,14,15,4,14,5,14,8,1,10};//测试价值 int bag = 0; int values = 0; putIntoBag(weight, value, bag, values, 0, 10, 34);//0为初始物品,10为物品总数,34为总重 cout <<"包包最多可以存放这么多价值的物品:"<< bestValue << endl; system("pause"); return 0; } 
     
    
  

测试结果:

背包问题(回溯法)

这里有几组测试数据:(引用一下)

https://blog.csdn.net/miscclp/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176638.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:25
下一篇 2026年3月26日 下午9:26


相关推荐

  • 0代码基础安装open claw,保姆级教程,送提示词,搭配飞书,养虾快人一步

    0代码基础安装open claw,保姆级教程,送提示词,搭配飞书,养虾快人一步

    2026年3月13日
    2
  • tcpdump抓包命令怎么用_linux系统抓包工具

    tcpdump抓包命令怎么用_linux系统抓包工具今天要给大家介绍的一个Unix下的一个网络数据采集分析工具,也就是我们常说的抓包工具。与它功能类似的工具有wireshark,不同的是,wireshark有图形化界面,而tcpdump则只有命令行。由于我本人更习惯使用命令行的方式进行抓包,因此今天先跳过wireshark,直接给大家介绍这个tcpdump神器。这篇文章,我肝了好几天,借助于Linux的man帮助命令,我把tcpdump的用法全部研究了个遍,才形成了本文,不夸张的说,应该可以算是中文里把tcpdump.

    2022年10月14日
    5
  • virtuebox 安装VBoxGuestAdditions,ubuntu下设置文件共享

    virtuebox 安装VBoxGuestAdditions,ubuntu下设置文件共享一 安装环境 hostOS Ubuntu16 04 Virtuebox5 0 16guestOS Ubuttu16 10 二 下载安装 VBoxGuestAdd 我在网上看到的版本都是像这样的 但是我从命令行里面装的 virtuebox 不知道为什么没有上面的那一行菜单栏这里需要自己下载 VBoxGuestAdd 安装增强功能 需要注意下载的版本 如果这里的版本

    2025年11月2日
    8
  • 无线桥接与中继的区别[通俗易懂]

    无线桥接与中继的区别[通俗易懂]无线桥接与中继的区别    无线桥接也就是WDS(WirelessDistributionSystem,无线分布式系统),其可以无线网络相互连接的方式构成的一个整体无线网络。WDS可把有线网络的资料,透过无线网络当中继架构来传送,借此可将网络资料传送到另外一个无线网络环境,或者是另外一个有线网络。   &nb…

    2022年4月19日
    201
  • 计算机管理找不到指定模块,卸载时找不到指定模块怎么办_电脑卸载找不到指定模块处理方法-win7之家…

    计算机管理找不到指定模块,卸载时找不到指定模块怎么办_电脑卸载找不到指定模块处理方法-win7之家…我们在使用电脑的过程中,对于系统中安装的大不多数软件有些是不需要,因此就需要卸载掉,以此保证电脑的内存充足,但是近日有的用户发现自己的电脑在卸载软件时总是会有找不到指定模块的提示,那么卸载时找不到指定模块怎么办呢?下面小编就来告诉大家电脑卸载找不到指定模块处理方法。具体方法:方法1:电脑清理法1、打开电脑安装的安全软件(这里以360为例),点击“电脑清理”。2、进入后找到“清理注册表”这项,然后在…

    2022年7月13日
    50
  • imx8 usb otg模式切换

    imx8 usb otg模式切换内核驱动名称 drivers usb chipidea debug cdrivers usb chipidea core cdrivers usb chipidea ci hdrc imx cDTS 文件节点 fsl imx8dx dtsiusbotg1 usb 5b0d0000 compatible fsl imx8qm usb fsl imx2

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号