1/5
.
Tôi : t
. a.
..
,.
2/5
I.
:
[i] (1<=i<=n) |a[i]|<=10^8. (k<=n)
C (|C|<=2*(10^9)) .
.
).
)
0,1
.
Var n:byte; C:longint;
A:array[1 18]of longint;
x,bestSelection:array[1 18]of byte;
Procedure try(i:byte);
Var
j,k:byte;
Test:longint;
Begin
For j:=0 to 1 do begin
x[i]:=j;
if (i<n) then try(I+1)
else begin
test=0;
for k:=1 to n do inc(test,x[k]*a[k]);
if ((test<=C)and (test>bestsum)) then begin
.
bestsum:=test;
bestselection:=x;
end;
end;
End;
End;
Var n:byte; bestsum,C:longint;
bestselection:longword;
A:array[1 18]of longint;
Procedure duyet;
Var I,k:byte; Test:longint; S,last:longword;
Begin
Bestsum:=0;
Bestselection:=0;
last:=(1 shl n)- 1; .
For s:=1 to last do begin
Test:=0;
For i:=0 to n-1 do
inc(Test,((s shr I) and 1)*a[i+1]);
If (Test>bestsum) and (Test <=C) then begin
bestsum:= Test;
bestselection:=s;
End;
End;
End;
(n*(2^n), ,
, th hic ý
ng O(n*(2^n)) mt cách rõ ràng nht.
3/5
Var n:byte;
C,bestsum:longint;
A:array[1 18]of longint;
bestselection:longword;
Procedure duyettrangthaicocchan;
Var I,k:byte;
T : array[0 1 shl 18]of longint; .
S,p,last:longword;
Begin
last:=(1 shl n)- 1; .
Bestsum:=0; Bestselection:=0; T[0]:=0;
//Tin hành duyt các trng thái.
For s:=1 to last do begin
For i:=0 to n-1 do
If (((s shr i) and 1)=1) then break;
P:= s and (not (1 shl i));
.
0)
T[s]:=T[p] + a[i+1];
If (T[s]>bestsum) and (T[s]<=C) then begin
bestsum:=t[s];
bestselection:=s;
End;
End;
End;
(i*(2^n)) i . N
. 1) i ngay
khi i=0.
4/5
II.
Xét bài toán sau: CHESSCBG (
Một bàn cờ thế là một bảng gồm 4 dòng, 4 cột. Mỗi thế cờ là một cách sắp xếp 8 quân cờ, hai quân khác nhau ở hai ô khác nhau. Bài
toán đặt ra là cho hai thế cờ 1 và 2, hãy tìm một số ít nhất bước di chuyển quân để chuyển từ thế 1 sang thế 2; một bước di chuyển
quân là một lần chuyển quân cờ sang ô trống kề cạnh với ô quân cờ đang đứng.
Dữ liệu vào
Từ file văn bản gồm 8 dòng, mỗi dòng là một xâu nhị phân độ dài 4 mà số 1/0 tương ứng với vị trí có hoặc không có quân cờ. Bốn
dòng đầu là thế cờ 1, bốn dòng sau là thế cờ 2.
Dữ liệu ra
Gồm 1 dòng duy nhất là số bước chuyển quân ít nhất
Ví dụ
Input:
1111
0000
1110
0010
1010
0101
1010
0101
Output:
4
Thut toán: c v 1 dãy 16bit, và chuyn thành 1 s hi th. Sau n hay BFS t nh này tnh kia và
m s bài toán th ng.
5/5
III. Quy H:
sau:
*n. Output: . Sau khi
.
:(n!) =20i
/sy trong
s.
:
.
jt j+1.
T[SS S.
{a,b,c, di ,b,c,d
T[ {1,2,5} = 10011= 19 :
- T[ {2,5} = 10010 =18 } + a[3,1];
- T[ {1,5} = 10001 =17 } + a[3,2];
- T[ {1,2} = 00011 = 3 } + a[3,5];
3. => T[19.
t: T[s] = max (T[p] + a[k,j: s k = 1) j S.
[ = (1 shl n)-1 ]1 giây.
.
6/5
cho thu trên:
const
fi='maxmatrix.inp';
fo='maxmatrix.out';
maxn=20;
var n:byte; sum:int64; lasts:longword;
a:array[1 maxn,0 maxn]of longint;
status:array[0 (1 shl maxn)] of int64;
truy:array[0 (1 shl maxn)] of byte;
procedure doc;
var f:text; i,j:byte;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do begin
for j:=1 to n do
read(f,a[i,j]);
readln(f);
end;
close(f);
end;
function bitoff(s:longword;i:byte):longword; begin
bitoff:=s and (not (1 shl i));
end;
function getbit(s:longword;i:byte):byte; begin
getbit:=(s shr i) and 1;
end;
procedure ghi;
var row:array[1 maxn]of byte;
i,j:byte; s:longword; f:text;
begin
assign(f,fo); rewrite(f);
writeln(f,sum);
s:=lasts;
{row[i] mang nghĩa là ở hàng i, ta sẽ chọn cột row[i]}
for i:=n downto 1 do begin
row[i]:=truy[s];
s:=bitoff(s,truy[s]-1);
end;
for i:=1 to n do
writeln(f,a[i,row[i]],'[',i,',',row[i],']');
close(f);
end;
procedure xuli;
var
i,j,k:byte;
list1:array[1 maxn]of byte;
s,p:longword;
begin
status[0]:=0;
lasts:=(1 shl n) - 1; //trạng thái hoàn thành
{Tính các trạng thái}
for s:=1 to lasts do begin
{giải mã trạng thái s: list1 sẽ lưu các vị trí bit=1,
k là số lượng bit=1, đồng thời cũng là dòng ta đang xét}
k:=0;
for i:=0 to n-1 do
if getbit(s,i)=1 then begin
inc(k);
list1[k]:=i;
end;
{giả sử chọn cột đầu tiên}
j:=list1[1]+1;
p:=bitoff(s,j-1);
truy[s]:=j;
status[s]:=status[p]+a[k,j];
{xét các cột còn lại}
for i:=2 to k do begin
j:=list1[i]+1;
p:=bitoff(s,j-1);
if status[s]<status[p]+a[k,j] then
begin
status[s]:=status[p]+a[k,j];
truy[s]:=j;
end;
end;
end;
sum:=status[lasts];
end;
begin
doc; xuli; ghi;
end
Do s hiu ct là 1i din cho ct i+1, Ta có th li các ct 0n-i
din cho chính ct i.
7/5
(n*(2^n))
IV.
:
QBSELECT, QBGAME, CHESSCBG, LEM2, LEM3, MIXUP2, LASCALE, CHNREST (*), VMMTFIVE