C C++ 算法实例大全

2020-01-06 16:05:16王旭

七 进制转换

1.任意正整数进制间的互化

除n取余

2.实数任意正整数进制间的互化
乘n取整

3.负数进制:
设计一个程序,读入一个十进制数的基数和一个负进制数的基数,并将此十进制数转换为此负 进制下的数:-R∈{-2,-3,-4,....-20}

八 全排列与组合的生成

1.排列的生成:(1..n)


procedure solve(dep:integer);
var
i:integer;
begin
if dep=n+1 then begin writeln(s);exit; end;
for i:=1 to n do
if not used[i] then begin
s:=s+chr(i+ord(''0''));used[i]:=true;
solve(dep+1);
s:=copy(s,1,length(s)-1); used[i]:=false;
end;
end; 

2.组合的生成(1..n中选取k个数的所有方案)


procedure solve(dep,pre:integer);
var
i:integer;
begin
if dep=k+1 then begin writeln(s);exit; end;
for i:=1 to n do
if (not used[i]) and (i>pre) then begin
s:=s+chr(i+ord(''0''));used[i]:=true;
solve(dep+1,i);
s:=copy(s,1,length(s)-1); used[i]:=false;
end;
end; 

九.查找算法

1.折半查找


function binsearch(k:keytype):integer;
var low,hig,mid:integer;
begin
low:=1;hig:=n;
mid:=(low+hig) div 2;
while (a[mid].key<>k) and (low<=hig) do begin
if a[mid].key>k then hig:=mid-1
else low:=mid+1;
mid:=(low+hig) div 2;
end;
if low>hig then mid:=0;
binsearch:=mid;
end; 

2.树形查找

二叉排序树:每个结点的值都大于其左子树任一结点的值而小于其右子树任一结点的值。
查找


function treesrh(k:keytype):pointer;
var q:pointer;
begin
q:=root;
while (q<>nil) and (q^.key<>k) do
if k<q^.key then q:=q^.left
else q:=q^.right;
treesrh:=q;
end; 


十、贪心

*会议问题
(1) n个活动每个活动有一个开始时间和一个结束时间,任一时刻仅一项活动进行,求满足活动数最多的情况。
解:按每项活动的结束时间进行排序,排在前面的优先满足。

(2)会议室空闲时间最少。

(3)每个客户有一个愿付的租金,求最大利润。

(4)共R间会议室,第i个客户需使用i间会议室,费用相同,求最大利润。

十一、回溯法框架

1. n皇后问题


procedure try(i:byte);
var j:byte;
begin
if i=n+1 then begin print;exit;end;
for j:=1 to n do
if a[i] and b[j+i] and c[j-i] then begin
x[i]:=j;
a[j]:=false; b[j+i]:=false; c[j-i]:=false;
try(i+1);
a[j]:=true; b[i+j]:=true; c[j-i]:=true;
end;
end;

2.Hanoi Tower 汉诺塔


h(n)=2*h(n-1)+1 
h(1)=1
初始所有铜片都在a柱上
procedure hanoi(n,a,b,c:byte); {将第n块铜片从a柱通过b柱移到c柱上}
begin
if n=0 then exit;
hanoi(n-1,a,c,b); {将上面的n-1块从a柱通过c柱移到b柱上}
write(n,'moved from',a,'to',c);
hanoi(n-1,b,a,c);{ 将b上的n-1块从b柱通过a柱移到c柱上
end;