- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
全国青少年信息学奥林匹克联赛
搜索基础算法
-、深度搜索(DFS)
从一个简单题日开始。
例1?输出n个元素的无重复的全排列。(l=n=9)
在这里我们可以对每一个元素编号,形成1,2,…, 9个数字的全排列。我们用一个
-?维数组來处理,相当于有9个位置,每个位置可以放1到9,再进行重复性判断, 即在每个位置放一个数字时判断它前面是否已经使用该数字。通过数组小元素值的 变化,产半全排列。
下而给出非递归例程,其中,变量k是表示位置指针,数组x用来装每个位置的 值。
const n二5;
var
x:array[1.. 10] of integer;
k: integer; {位置指针}
function try:boolean; {判重函数}
var i:integer;
begin
for i : = 1 to kT do
if x[i]=x[k] then
begin try:=false;exit;end;
try:=true;
end;
procedure out; {输出过程}
var i:integer;
begin
for i:=1 to n do
write(x[i]);
writeIn;
end;
begin
k:=l;
x[l]:=O;
wh订e k0 do
begin
inc(x[k]);
{当前笫k个位置中增加1}
if x [k]n then
dec(k)
{判断当前第k个位置中是否超界,超界指针后移一位}
else
if try then
begin
{判重}
inc (k); x[k]:二0; {前进 1 位}
if kn then {判断指针是否超界,决定一个排列是否完成,完 成指针后移一位}
begin out;dec (k);end;
end;
end;
end.
下面是递归例程:
const n二5;
var
x:array[1.. 10] of integer;
{判重函数jl表示位置,k表示所{输出过程}
{判重函数jl表示位置,k表示所
{输出过程}
var i:integer;
begin
for i:=1 to vl-1 do
if x[i]=k then
begin try:=false;exit;end;
try:二true;
end;
procedure out; var i:integer;
begin
for i:=l to n do
write(x[i]);
writein;
end;
procedure search (v: integer) ; (v 表示第 v 个位置}
var i:integer;
begin
if vn then begin out;exit;end; {若 v 超界,一个排列完成}
for i:=l to n do {在第v个位置上分别放1到n}
if try(v, i) then {如果不重复,处理第v+1个位置}
begin x[v]:=i;search(v+1);end;
end;
begin
search (1);
end.
说明:使用非递归的好处是节约内存,当一些题日对内存消耗较大时,建议使用非 递归方式;但使用递归方式在程序运行时间上要好一些,因为在每个节点扩展时, 递归方式少一个范围超界判断。
例题一
简单的背包问题。
设有一个背包,町以放入的重量为s。现有n件物品,重量分别为均为正整数,从
n件物品中挑选若干件,使得放入背包的重量之和正好为so
分析:可以设定n个位置,每个位置只能放0和1,这样形成一个0和1可重复的排 列,或者是产生一个n位的2进制数。
例程:
var
w:array[1. . 20] of integer;
x:array[1.. 20] of integer;
{判断目标函数
{判断目标函数11表示位置,k表示所
{v表示第v个位置}
n:integcr;
s:longint;
procedure init;
var i:integer;
begin
readln (n, s);
for i:=1 to n do
read(w[i]);
end;
function try(vl,k:integer):boolean;
放的值}
var i:integer;
si:longint;
begin
si :=w[k];
for i : = 1 to vlT do
si :二sl+x[i]*w[i];
if si二s then
begin
for i:=1 to vl-1 do
if x[i]=0 then
write(w[i],); writeln(w[k]);
end;
if sl=s then
begin try:=false;exit;end;
else
try:=true;
end;
proced
您可能关注的文档
最近下载
- UbuntuLinux操作系统第2版(微课版)钟小平课后习题答案.doc VIP
- 输电线路三跨的经验分享.ppt VIP
- 电动汽车分布式驱动系统动力学分析与优化设计.docx VIP
- 专题1.4数轴与动点经典题型(四大题型)(原卷版+解析).docx VIP
- 幼儿小蝌蚪找妈妈绘本ppt课件.pptx VIP
- 磷酸铁行业现状.docx VIP
- 马克思主义与社会科学方法论课后习题答案(2018版).pdf VIP
- 6.1 树立法治观念 统编版道德与法治八年级上.pptx VIP
- GB_T 43933-2024 金属矿土地复垦与生态修复技术规范.pdf VIP
- 车牌识别系统软件使用说明8.1软件基本设置.pdf VIP
原创力文档


文档评论(0)