没有合适的资源?快使用搜索试试~ 我知道了~
用c语言解决背包问题正文.doc
0 下载量 73 浏览量
2022-12-02
16:23:32
上传
评论
收藏 144KB DOC 举报
温馨提示
试读
25页
用c语言解决背包问题正文.doc
资源推荐
资源详情
资源评论
漆巧 《用 C 语言解决背包可行性问题》 第 1 页 共 25 页
1
用 c 语言解决背包可行解问题
学生姓名:漆巧 指导老师:卢曼莎
摘 要 本课程设计是为了解决假设有一个能装入总体积为 T 的背包和 n 件体积
分别为 w1 , w2 , … , wn 的物品,能否从 n 件物品中挑选若干件恰好装满背包,
即使 w1 +w2 + … + wn=V,要求找出所有满足上述条件的解。在课程设计中,
系统开发平台为 windowsxp,程序设计设计语言采用 C 语言,程序运行平台为
windows xp。设计中,对于背包问题,主要采用递归的思想。程序通过调试运行,
初步实现了设计目标,并且经过适当完善后,将可以应用在实际生活中。
关键词 枚举;回溯法;动态规划;栈;递归
1 引言
本课程设计是为了解决旅行者的背包问题。将分别采用枚举;回溯;动态规
划三种方法去设计。通过对这三种方法的应用,可以更好的解决类似的问题。同
时采用栈作为该程序的数据结构,利用栈进行语法检查,深度优先的搜索方式解
空间,实现递归过程和函数的调用,在设计时还使用 c 语言的数组及其循环语言
来实现程序。
1.1 课程设计目的
研究应用递归思想,背包算法。应用数据结构基础知识进行实际问题求解与
分析。编程实现算法。
漆巧 《用 C 语言解决背包可行性问题》 第 2 页 共 25 页
2
1.2 课程设计的方法
本课程设计采用枚举,回溯,动态规划三种方法解决常见的背包问题。例如
用回溯法解题,在搜索解空间树时,只要其左子节点是一个可行节点,搜索就进
入左子树,在右子树可能包含最优解是才进入右子树搜索。否则将右子树剪去。
具体步骤如下:
(1)针对所给问题,定义问题的解空间;
(1)确定易于搜索的解空间结构
(3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜
索。
1.3 系统的开发平台
在课程设计中,系统开发平台为 windows xp, 课程设计设计语言采用 C 语言,
程序运行平台为 windows xp。
2 整体设计流图
2.1 本课题设计所用数据结构以及流程图
背包问题求解涉及到的数据结构主要是栈,下面我就详细的介绍一下有
关栈方面的知识。
栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。当用
一维数组存储栈时,被称为顺序栈。
(1) 通常称插入、删除的这一端为栈顶(Top ), 另 一 端 称 为 栈 底
(Bottom);
(2)当表中没有元素时称为空栈,用 Top==-1 表示;
漆巧 《用 C 语言解决背包可行性问题》 第 3 页 共 25 页
3
(3)栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中
"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底
部,要到最后才能删除。
栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表。栈的修
改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元
素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最
后才能删除。流程图如下:
Push(进栈)
a0 a1 …… a n-1
Pop(出栈)
top(栈顶)
栈的基本运算:
(1)InitStack(S)
构造一个空栈 S。
(2)StackEmpty(S)
判栈空。若 S 为空栈,则返回 TRUE,否则返回 FALSE。
(3)StackFull(S)
判栈满。若 S 为满栈,则返回 TRUE,否则返回 FALSE。
注意: 该运算只适用于栈的顺序存储结构。
(4)Push(S,x)
进栈。若栈 S 不满,则将元素 x 插入 S 的栈顶。
(5)Pop(S)
退栈。若栈 S 非空,则将 S 的栈顶元素删去,并返回该元素。
漆巧 《用 C 语言解决背包可行性问题》 第 4 页 共 25 页
4
(6)StackTop(S)
取栈顶元素。若栈 S 非空,则返回栈顶元素,但不改变栈的状态。
回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,
并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是
解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,
满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前
候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。
在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。
回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题
的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。
算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题
的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向
其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回
溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜
索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解
就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,
它适用于解一些组合数较大的问题。
回溯即是较简单、较常用的搜索策略。全面访问所有可能的情况,分为
两种:不考虑给定问题的特有性质,按事先顶好的顺序,依次运用规则,即
盲目搜索的方法;另一种则考虑问题给定的特有性质,选用合适的规则,提
高搜索的效率,即启发式的搜索。
可用回溯法求解的问题 P,通常要能表达为:对于已知的由 n 元组
(x1,x2,…,xn)组成的一个状态空间 E={(x1,x2,…,xn)∣xi∈Si ,
i=1,2,…,n},给定关于 n 元组中的一个分量的一个约束集 D,要求 E 中
满足 D 的全部约束条件的所有 n 元组。其中 Si 是分量 xi 的定义域,且 |Si|
有限,i=1,2,…,n。我们称 E 中满足 D 的全部约束条件的任一 n 元组为
问 题 P 的 一 个 解 。 若 已 有 满 足 约 束 条 件 的 部 分 解 , 不 妨 设 为
( x1,x2,x3,……xi ), I<n, 则 添 加 x(i+1) 属 于 s(i+2) , 检 查
剩余24页未读,继续阅读
资源评论
zzzzl333
- 粉丝: 676
- 资源: 7万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功