树和二叉树(4N皇后(回溯法)).ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
树和二叉树(4N皇后(回溯法))

1 2 3 4 5 6 7 算法思想: 从编号1的省开始,按4种颜色的排列顺序,首先选择第一种颜色,然后检查是否矛盾,即相邻的区域中是否已有该颜色,若不矛盾,则涂色,若矛盾,则选择下一个颜色,再判断,当4种颜色都不可能时,则需回溯。 当第一个省的颜色确定之后,依次对第二个省、第三个省……进行处理,当所有省都涂上颜色之后,得到一种解法。 color:array[1..maxn] of integer; 其中,color[k]:表示第k个省所填的颜色 解空间 Color(1,2,1,3,1,3,4) 迷宫问题 Function pd(k:integer):boolean; Var m:integer; Begin m:=1; {从第一个省份开始检查是否冲突} pd:=true; {不冲突} while (m k) and (color[k] * g[m, k] color[m]) do inc(m); if k=m then pd:=false; {冲突} End; 约束条件 该点k涂的颜色(color[k)与和k相邻的点m(1=m=k-1)的颜色(color[m])相同 color[k] * g[m, k] =color[m] 状态树 迷宫问题 procedure search(k: integer); {递归搜索第m个省份} begin if k n then {是否所有省份都已经填色} begin write(color[1]); { 已全部填色,输出结果,终止程序} for j := 2 to n do write( , color[j]); writeln; halt end else {还未全部填色} for j := 1 to 4 do begin {依次用四种颜色对当前省份填色} if (k = n) and pd(k) then {没有冲突} begin color[k] := j; { 记录当前省份颜色} search(k + 1); {递归检查下一个省份} end; end; end; 四色问题(递归) 迷宫问题 输入:第一行一个整数,为背包的容量M;第二行一个整数,为物品的种数N;第三行N个整数为各物品的重量;第四行N个整数分别为N个物品的价值 输出:第一行为最大总价值;第二行为装入的各物品的重量(未装的物品用0);第三行为装入的各物品的价值 (未装的物品用0) 已知一个容量大小为M重量的背包和N种物品,每种物品的重量为Wi。若将物品放入背包将得到Pi的效益,求怎样选取物品将得到效益最大 输入样例: ?50 ?3 ?10 20 30 ?60 100 120 输出样例: ?220 ?0 20 30 ?0 100 120 测试数据: 输入: ?10 ?5 ?2 2 6 5 4 ?6 3 5 4 6 输出: ?? 0-1背包问题 bag:array[1..maxn] of 0..1; 其中,bag[k]=1表示第k个物品要取 0表示第k个物品不取 解空间 约束条件 第k个物品确定放置方法后,背包所剩重量足够放第K个物品 wei-bag[k]*w[k]=0 {wei:背包还能装的重量} Best:=0; 表示最大价值 当一组解产生后,得到当前总价值count, if countbest then best:=count 利用这种方法记录最优解!如果还要记录最优时的物品取法应: if countbest then begin best:=count; for i:=1 to n do y[i]:=bag[i]; 状态树 求最优值 0-1背包问题 本题可以用递归求解: 本题可用方法很多!非递归写法与前几题相似,请自己写出! 算法分析: 设当前有N个物品,容量为M; 这些物品要么选,要么不选,我们假设选的第一个物品编号为i(1~i-1号物品不选),问题又可以转化为有N-I个物品(即第I+1~N号物品),容量为M-Wi的子问题……如此反复下去,然后在所有可行解中选一个效益最大的便可。 回溯(状态恢复)后,需恢复的状态有: Bag[k] 背包可装的物品重量:wei:=wei+w[k]*i 已装物品的价值总和:count:=count:-c[k]*i 0-1背包问题

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档