0-1背包问题 回溯法

0-1背包问题 回溯法0 1 背包问题回溯法

0-1背包问题 回溯法

② 采用for循环对物品i装与不装两种情况进行讨论(0≤j≤1):

1> x[i]=j;

方法1

#include 
    int n,c,bestp;//物品的个数,背包的容量,最大价值 int p[10000],w[10000],x[10000],bestx[10000];//物品的价值,物品的重量,x[i]暂存物品的选中情况,物品的选中情况 void Backtrack(int i,int cp,int cw) { //cw当前包内物品重量,cp当前包内物品价值 int j; if(i>n)//回溯结束 { if(cp>bestp) { bestp=cp; for(i=0;i<=n;i++) bestx[i]=x[i]; } } else for(j=0;j<=1; j++) { x[i]=j; if(cw+x[i]*w[i]<=c) { cw+=w[i]*x[i]; cp+=p[i]*x[i]; Backtrack(i+1,cp,cw); cw-=w[i]*x[i]; cp-=p[i]*x[i]; } } } int main() { int i; bestp=0; printf("请输入物品个数和背包最大容量:\n"); scanf("%d%d",&n,&c); printf("请依次输入物品的价值:\n"); for(i=1;i<=n;i++) scanf("%d",&p[i]); printf("请依次输入物品的重量:\n"); for(i=1;i<=n;i++) scanf("%d",&w[i]); Backtrack(1,0,0); printf("最大价值为:\n"); printf("%d\n",bestp); printf("被选中的物品依次是(0表示未选中,1表示选中)\n"); for(i=1;i<=n;i++) printf("%d ",bestx[i]); printf("\n"); return 0; }
for(j=0;j<=1; ++j) // 枚举i所有可能的路径,

在满足限界函数和约束条件if(cw+x[i]*w[i]<=c)下,连续排列,直到碰壁,然后进行下一条路(另一个条件),进行下一次的遍历,直到结束,如图

(http://pic002.cnblogs.com/images/2011//51028.jpg)

最坏情况下有O(2n)个右儿子结点用限界函数,故计算0-1背包问题的回溯算法的时间复杂度为O(n2的n次方),在搜索过程中的任何时刻,仅保留从开始结点到当前可扩展结点的路径,其空间需求为O(从开始结点起最长路径的长度)。所以,空间复杂度为O(n)

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

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

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


相关推荐

  • python的进制转换器,Python进制转换[通俗易懂]

    python的进制转换器,Python进制转换[通俗易懂]进制转换:进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。简单转换理念:把二进制三位一组分开就是八进制,四位一组就是十六进制二进制与十进制:(1)二进制转十进制:“按权展开求和”(1011)2=1×2**3+0x2**2+1x…

    2022年5月19日
    42
  • 揭秘LangChain AI模型:性能对比,谁才是AI语言处理的佼佼者?

    揭秘LangChain AI模型:性能对比,谁才是AI语言处理的佼佼者?

    2026年3月13日
    1
  • Apache tez_apache ii

    Apache tez_apache ii转发自这位大佬博客:https://www.cnblogs.com/rongfengliang/p/6991020.html你可能听说过ApacheTez,它是一个针对Hadoop数据处理应用程序的新分布式执行框架。但是它到底是什么呢?它的工作原理是什么?哪些人应该使用它,为什么?如果你有这些疑问,那么可以看一下BikasSaha和ArunMurthy提供的呈现“ApacheTez:加…

    2025年8月7日
    8
  • Android学习——VAP源码

    Android学习——VAP源码一 背景介绍 1 VAP VideoAnimati 是直播中台使用的一个视频动画特效 SDK 可以通过制作 Alpha 通道分离的视频素材 再在客户端上通过 OpenGLES 重新实现 Alpha 通道和 RGB 通道的混合 从而实现在端上播放带透明通道的视频 已经接入的 app 同原理实现也用在其他 app 抖音 西瓜视频 今日头条 爱奇艺 比心等 2 方案对比目前较常见的动画实现方案有帧动画 gif webp lottie SVGA 对于复杂动画特效的实现做个简单对比方案

    2026年3月18日
    1
  • R语言——决策树模型

    R语言——决策树模型nbsp nbsp nbsp nbsp 决策树 TreeNodels 是一种创建树状模型的方法 它使用 基尼不纯度 GiniImpurity 或信息增益 InformationG 等标准对节点进行递归分割 以创建树状模型 决策树看起来像是以树状形式排列的一系列的 if else 语句 易于理解 执行速度快 并且 它能够很好地表现多个特征之间的相互作用 适用于多种数据类型 树状模型中 随机森林性能表现卓越

    2026年3月26日
    1
  • 对接文心一言(ERNIE-Bot)的微信聊天机器人源码V2

    对接文心一言(ERNIE-Bot)的微信聊天机器人源码V2

    2026年3月12日
    3

发表回复

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

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