You are on page 1of 96

Li ni u

Lp trnh ng (cn gi l phng php quy hoch ng) l mt k thut rt


hiu qu gii quyt nhiu bi ton tin hc, c bit l nhng bi ton ti u. S
lng bi ton c gii bng lp trnh ng cng rt ln, v d ring k thi
Olympic quc t v Tin hc IOI 2004 c ti 3 bi trong 6 bi thi c th gii bng
lp trnh ng. Nhiu nm gn y, trong hu ht cc thi chn HSG QG u
c t nht 1 trong 3 bi c th gii bng phng php quy hoch ng.
Nhm tc gi chng ti bin tp ti liu Bi tp quy hoch ng ny
mong mun gii thiu l thuyt v cc bi tp t n gin n phc tp ca lp
trnh ng. Cun sch s l ti liu qu bu i vi hc sinh nng khiu Tin hc,
sinh vin cc ngnh cng ngh thng tin v gio vin mn Tin hc ca cc
trng THPT.
Ti liu gm 4 chng:
Chng I: C s l thuyt
Chng II: Mt s bi tp c bn
Chng III: Bi tp chn lc
Chng IV: Mt s t gii
Chng I nu r t tng, v tr, ng dng ca lp trnh ng v cch nhn
din cc bi tp c th gii bng phng php quy hoch ng. Chng II phn
tch v dn ra chng trnh gii cc bi ton kinh in nh: Tm dy con khng
gim di nht, Dy con chung di nht, Tm dy con c tng bng S, .Chng
III, chng IV gii thiu bi, cch gii, chng trnh ca rt nhiu bi tp
chn lc.
Chng ti chn thnh cm n cc bn ng nghip nhn xt v gp
cho bn tho, trn trng cm n BGH trng THPT Chuyn Bc Giang khch
l, to iu kin cho nhm tc gi c nghin cu ti liu sm c ra mt
bn c.
1

Trong qu trnh bin son, mc d chng ti c gng, song ni dung


chuyn ngy cng c nhiu kha cnh mi v su sc nn chc chn ti liu
cn nhiu hn ch. Chng ti rt mong c bn c xa gn gp , ln ti bn
sau ti liu s hon thin hn.
Mi gp , xin gi n a ch:
Nhm Tin hc Trng THPT Chuyn Bc Giang

Chng I: C s l thuyt
I.1. T tng ca phng php quy hoch ng
I.1.1. Thut ton chia tr
Lp trnh ng cng nh chia tr l cc phng php gii mt bi ton
bng cch t hp li gii cc bi ton con ca n.
Thut ton chia tr c coi l thut ton thng dng nht trong Tin
hc. Khi gii mt bi ton P vi kch thc ban u no nu gp tr ngi v
kch thc qu ln, ngi ta thng ngh n vic gii cc bi ton tng t
nhng vi kch thc nh hn (gi l cc bi ton con ca P). T tng chia
tr thng c nhc ti nh hnh nh b dn tng chic a b gy c
b a.
Chia tr thc hin tch mt bi ton ban u thnh cc bi ton con
c lp, sau gii cc cc bi ton con ny v t hp dn li gii t bi ton
con nh nht n bi ton ban u.
Nhng gii tng bi ton con nh th no? Chng ta c th thc hin mt
cch n gin li tch bi ton con thnh cc bi ton con nh hn na, v
c tin hnh nh vy cho n khi gp cc bi ton con nh n mc d dng
gii c. Cc bi ton con cng c sinh ra sau mi ln tch c gi l
cng mc. Nhng bi ton con sinh ra sau hn th mc di (thp hn).
Th tc quy lun l cch thng dng v hiu qu thc hin thut
ton chia tr. Qu trnh quy ln lt xp dn cc bi ton con vo ngn
xp b nh v s thc hin gii cc bi ton con theo th t ngc li t bi
ton n gin nht trn nh ngn xp cho n khi gii c bi ton ban u
y ngn xp.
V d: Cho mng a[1..n] gm cc s sp tng. Tm phn t ca mng c
gi tr bng s x cho trc.
3

Xt chng trnh thc hin thut ton tm kim nh phn (mt kiu chia
tr rt ph bin) gii bi ton trn. Trong chng trnh chnh c li gi
th tc tim(1,n). Sau y l th tc tim(i,j):
Procedure tim(i,j : integer); {Tim x c trong mng a[i .. j] hay khng}
Var k : integer;
Begin
K := (i+j) div 2;
If a[k] = x then
Begin
Write(Co phan tu bang ,x);
Halt;
End
Else
If (a[k] < x) and (k<j) then tim(k+1,j)
Else
If (a[k] > x) and (k>i) then tim(i,k -1)
End;
Do ch tm kim trn mt trong hai phn c tch ra, nn phc tp
thut ton l O(log2n), tt hn l tm kim tun t.

I.1.2. H thc truy hi


Gii bi ton thng tin hnh theo nhiu bc. Kt qu ca mt bc
thng da vo kt qu ca cc bc thc hin trc . Do vy, cn xy
dng h thc th hin quan h v kt qu gia cc bc gi l h thc truy
hi.
V d 1: Cho dy s Fibonaci {F1, F2, , Fn}, trong :
F1 = F2 = 1 v Fn = Fn-1 + Fn-2 vi n > 2 (1). Tm s hng th n.
4

H thc tnh s hng th n ca dy Fibonaci l h thc (1) cho sn


trong bi.
V d 2: Cho mt dy N s nguyn A 1, A2, , An. Hy tm cch xo i mt s
t nht s hng dy cn li l n iu hay ni cch khc hy chn mt s
nhiu nht cc s hng sao cho dy B gm cc s hng theo trnh t xut
hin trong dy A l n iu.
Minh ho cho v d 2:
Dy A: 1, 4, 10, 9, 8, 17, 11, 7, 12, 6
Dy B: 1,4,10,11,12
Phn tch gii bi ton ta thy:
Khi dy A c mt phn t a1th dy B c 1 phn t.
M rng bi ton vi dy A c 2 phn t, c 3 phn t, tm di
dy B. Ta c bi ton tng qut: Gi F[i] l s phn t ca dy con B khi dy A
c cc phn t t 1 n i
D dng tnh c:
F[i] := 1 nu khng tn ti j:= 1..i-1 A[j] < A[i]
F[i] := max{F[j], j=1..i-1 tho mn a[j] < a[i]} + 1; (2)
Nh vy, gii bi ton v d 2 ta phi tin hnh qua n bc. li gii
bc i (i=1,2,,n) ph thuc vo li gii ca i-1 bc trc . H thc (2)
chnh l h thc truy hi ca bi ton.

I.1.3. Lp trnh ng l g?
Lp trnh ng ging phng php chia tr ch: li gii ca bi ton
c t hp t li gii cc bi ton con.
Chia tr s phn chia bi ton ban u thnh cc bi ton con c lp
(s phn chia c cu trc dng cy), gii cc bi ton con ny thng bng
quy, sau t hp li gii ca chng c li gii ca bi ton ban u.
5

Lp trnh ng (dynamic programming) cng phn chia bi ton thnh cc


bi ton con, nhng cc bi ton con ph thuc nhau (hay dng t gi nhau
cng c), mi bi ton con c th tham chiu ti cng mt s bi ton con
mc di (s phn chia khng c cu trc dng cy xem hnh 1).

Hnh 1: th bi ton con cho dy Fibonacci. y khng phi l mt cu


trc cy m l mt th c hng phi chu trnh m t quan h gia cc bi
ton con gi nhau.
Ni rng mt bi ton c cc bi ton con trng nhau c ngha l mi bi
ton con c s dng gii nhiu bi ton ln hn khc nhau. V d,
trong dy Fibonacci, F3 = F1 + F2 and F4 = F2 + F3 khi tnh mi s u phi tnh
F2. V tnh F 5 cn n c F3 v F4, mt cch tnh F 5 mt cch ngy th c th s
phi tnh F 2 hai ln hoc nhiu hn. iu ny p dng mi khi c mt cc bi
ton con gi nhau: mt cch tip cn ngy th c th tn thi gian tnh ton li
li gii ti u cho cc bi ton con m n gii.
trnh vic , ta lu tr li gii ca cc bi ton con gii. Do vy,
nu sau ny ta cn gii li chnh bi ton , ta c th ly v s dng kt qu
c tnh ton. Hng tip cn ny c gi l lu tr (trong ting Anh
c gi l memoization, khng phi memorization, d t ny cng hp ngha).
Nu ta chc chn rng mt li gii no khng cn cn thit na, ta c th
xa n i tit kim khng gian b nh. Trong mt s trng hp, ta cn c
th tnh li gii cho cc bi ton con m ta bi t trc rng s cn n.
6

Khi gii bi ton Fibonaci c i (vi i tng t 2 n n), ta u s dng kt


qu ca 2 bi ton con c i-1 v i-2;
Lp trnh ng do nh ton hc ngi M l Richard Bellman (1920-1984)
pht minh vo nm 1953.
Lp trnh ng thng dng gii cc bi ton ti u bi ton yu cu
tm mt gii php tt nht trong cc gii php c th tm c.
C s ca lp trnh ng trong bi ton ti u l nguyn l ti u Bellman:
Dy ti u cc quyt nh trong mt qu trnh quyt nh nhiu giai on c
thuc tnh l d trng thi v cc quyt nh ban u bt k th no, nhng
quyt nh cn li phi to thnh mt cch gii quyt ti u khng ph thuc
vo trng thi c sinh ra t nhng quyt nh ban u

I.1.4. Phng php quy hoch ng


Trong ngnh khoa hc my tnh, phng php quy hoch ng l mt
phng php gim thi gian chy ca cc thut ton th hin cc tnh cht ca
cc bi ton con gi nhau v cu trc con ti u.
T tng ch o ca phng php quy hoch ng c th tm lc nh
sau:
Chia 1 bi ton ln thnh cc bi ton con tng t c kch thc nh hn
cho n khi nhn c cc bi ton con m li gii c th xy dng d dng.
Ta phi tm ra mi quan h gia nghim ca bi ton vi nghim ca cc
bi ton con, mi quan h th hin 1 cng thc truy hi hay mt hm gi l
cng thc quy hoch ng (hay hm quy hoch ng).
Khi tnh ton chng ta xut pht tnh t nghim cc bi ton con ban u,
sau kt hp nghim ca cc bi ton con theo cng th c quy hoch ng ta
c nghim bi ton con c c ln hn. Qu trnh c tip tc nh vy cho
n khi ta c nghim ca bi ton cho.
7

Vy: tng c bn ca quy hoch ng tht n gin: trnh tnh ton


li mi th hai ln, m lu gi kt qu tm kim c vo mt bng lm gi
thit cho vic tm kim nhng kt qu ca trng hp sau. Chng ta s lm
y dn gi tr ca bng ny bi cc kt qu ca nhng trng hp trc
c gii. Kt qu cui cng chnh l kt qu ca bi ton cn gii
V d: Tnh s hng th n ca dy Fibonaci bng phng php quy hoch
ng nh sau:
Nghim ca mi bi ton con ch cn tnh 1 ln v c lu trong mng 1
chiu F. Khi tm kt qu ca cc bi ton c ln hn, kt qu ca cc bi ton
con ch vic ly ra s dng.
F1 := 1; F2 := 1;
For i := 3 to n do F[i] := F[i-2] + F[i-1];

I.2. Cc bc thc hin gii bi ton bng phng php quy


hoch ng
I.2.1. Cc bc c bn:
Bc 1: Phn tch tm cng thc quy hoch ng
- Tm ra cng thc nghim ca bi ton ln thng qua vic gii cc bi
ton con.
- Xc nh nghim ca bi ton con n gin (trong trng hp c s)
Bc 2: Thc hin tnh ton v t chc d liu
- u tin tnh nghim ca bi ton con n gin (c s)
(Khi to gi tr ban u cho hm QH)
- Da vo hm QH xy dng ta tnh nghim ca bi ton theo kch
thc ln dn cho n khi nhn c nghim ca bi ton cho.
Bc 3: T chc d liu v ci t

- Thng dng mng mt chiu hoc hai chiu lu tr li cc gi tr


ca cc bi ton con (gi tr ca hm QH)
- Ngoi ra, chng ta phi dng mt s bin, thng thng cng l mng
lu tr li trng thi ca bi ton sau ny chng ta c th truy xut li gii
ca bi ton.

I.2.2. T chc ci t:
- C th dng vng lp
- Hoc dng quy
- Nghim ca cc bi ton con c tnh ton 1 ln v lu tr trong mng
khi cn ly mng ra v s dng

I.2.3 Khi no dng phng php quy hoch ng?


- Khi gp bi ton c tnh cht truy hi
- Khi li gii bi ton bc sau c xy dng thng qua li gii bi
ton bc trc.
- Kch thc bi ton khng qu ln
*u im:
- Li gii ngn gn, sang sa, c tnh logic cao, chng trnh chy nhanh.
*Nhc im:
- Khng phi bi no cng gii bng QH
- Vic tm ra cng thc QH ca nhiu bi ton l kh khn
- Khng c cng thc chung
- B hn ch v b nh v chng ta phi lu tr nghim ca cc bi ton
con.

Chng II: Mt s bi tp c bn
Bi 1: Tm dy con khng gi m nhiu phn t nht;
Cho dy s nguyn c n phn t a1, a2, , an. Mt dy con khng gim ca
dy cho l dy cc phn t cn li ca dy sau khi ta xa b mt hoc
mt s phn t bt k ca n, cc phn t ca dy con to thnh dy khng
gim. V d: dy 1,4,10,11,12 l mt dy con khng gim ca dy 1, 4, 10, 9, 8,
17, 11, 7, 12, 6.
Yu cu: Tm dy con khng gim ca dy a gm nhiu phn t nht.
D liu: Vo t file vn bn DAYCON.INP gm:
Dng u tin ghi s N (0 < N < 10 5).
Cc dng tip theo, mi dng ghi 10 s nguyn ca dy N s nguyn a 1, a2,
.., an. Dng cui cng c th t hn 10 s. Cc s trn mt dng cch nhau mt
du cch.
Kt qu: Ghi ra file vn bn DAYCON.OUT gm:
S max l di dy con khng gim di nht tm c.
Ch s xut hin ca cc s hng ca dy con trong dy cho.
V d:
DAYCON.INP

DAYCON.OUT

10

6 5 8 12 6 9 7 13 2 13

2 5 7 8 10

Hng dn:
Gi L(i) l di dy con tng di nht, cc phn t ly trong min t a1
n ai v phn t cui cng l a i.
Ta c cng thc QH tnh L(i) nh sau:
L(1) = 1
L(i) = max(1, L(j)+1 vi mi phn t j: 0 < j < i v a j ai).
10

Bng phng n l mt mng mt chiu L lu tr cc gi tr ca hm


QH L(i). on chng trnh tnh cc gi tr ca mng L nh sau:
for i := 1 to n do
begin
L[i] := 1;
for j:=1 to i - 1 do
if (a[j]<=a[i]) and (L[i]<L[j]) then L[i]:=L[j]+1;
end;
Nh vy chi ph khng gian ca bi ton l O(n), chi ph thi gian l O(n 2).
* Chng trnh ci t:
program day_con_khong_giam_dai_nhat;
uses crt;
const fi='DAYCON.inp';
fo='DAYCON.out';
max=100000;
type arrA=array[0..max]of longint;
arrB=array[1..max,1..max]of longint;
var

f:text;
a:arrA;
n,kq,luu,dem:longint;
d,truoc,k:arrA;

procedure
var

init;

i:longint;

begin
assign(f,fi);
reset(f);
11

readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure
var

process;

i,j:longint;

begin
for i:=1 to n do
truoc[i]:=i;
d[1]:=1;
for i:=1 to n do
begin
d[i]:=1;
for j:=1 to i-1 do
if a[i]>=a[j] then
if d[j]+1>d[i] then
begin
d[i]:=d[j]+1;
truoc[i]:=j;
end;
end;
kq:=0;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
dem:=0;
12

while truoc[luu]<>luu do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure
var

inkq;

i:longint;

begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,k[i],' ');
close(f);
end;
BEGIN
init;
process;
inkq;
END.

Bi 2: Dy con chung di nht;


Cho hai dy s nguyn a = (a 1, a2, , aM), b = (b1, b2, , bN), vi M,N < 200.
13

Hy tm mt dy con chung c=(c 1, c2, , cK) ca a v b gm nhiu s hng


nht. Dy con chung c nhn c bng cch xa i mt s s hng ca dy a, c
cng nhn c bng cch xa i mt s s hng ca dy b, sau khi xa hai
dy gi nguyn th t cc phn t cn li.
D liu: Vo t file vn bn DAYCC.INP c cu trc nh sau:
Dng u tin ghi 2 s nguyn dng M, N.
Dng th 2 ghi cc s a1, a2, , aM;
Dng th 3 ghi cc s b1, b2, , bN;
Kt qu: Ghi ra file vn bn DAYCC.OUT c cu trc:
Dng u ghi s K l s lng cc s hng ca dy con chung c (nu khng
c dy con chung th ghi s 0);
Trong k dng tip theo, dng th i (I = 1, 2, .., k) ghi 2 s x, y vi ngha l:
s hng th i ca dy c l s hng th x ca dy a v l s hng th y ca dy
b;
V d:
DAYCC.INP

DAYCC.OUT

76

3513553

22

153531

43
64
75

*Hng dn:
Gi L(i,j) l di dy con chung di nht ca dy a(i) gm i phn t
phn u ca dy a (a(i) = a[1..i]) v dy b(j) gm j phn t phn u ca dy b

14

(b(j)

=b [1..j]).

Ta c cng thc quy hoch ng nh sau:


L(0,j)=L(i,0)=0.
L(i,j) = L(i - 1,j - 1)+1 nu a[i] = b[j].
L(i,j) = max(L(i - 1,j), L(i,j - 1)) nu a[i] b[j].
*Chng trnh ci t:
Program Dayconchung;
uses crt;
const fi='daycc.inp';
fo='daycc.out';
maxmn=100;
var f:array[0..maxmn,0..maxmn] of integer;
g:text;
m,n:integer;
a,b:array[1..maxmn] of integer;
Procedure init;
var i:integer;
Begin
assign(g,fi); reset(g);
readln(g,m,n);
for i:=1 to m do read(g,a[i]);
for i:=1 to n do read(g,b[i]);
close(g);
End;
Function max(x,y:integer):integer;
Begin
15

if x > y then max:=x else max:=y;


End;
Procedure Build;
var i,j:integer;
Begin
for i:= 0 to m do f[i,0]:=0;
for i:= 0 to n do f[0,i]:=0;
for i:=1 to m do
for j:=1 to n do
if a[i] <> b[j] then f[i,j] := max(f[i-1,j],f[i,j-1])
else

f[i,j] := f[i-1,j-1] + 1;

End;
Procedure result;
var i,j:integer;
Begin
assign(g,fo); rewrite(g);
writeln(g,f[m,n]);
i := m; j := n;
while (i<>0) and (j<>0) do
Begin
if a[i] = b[j] then
Begin
writeln(g,i,' ',j);
dec(i);
dec(j);
End
else
16

Begin
if f[i,j] = f[i-1,j] then dec(i)
else if f[i,j] = f[i,j-1] then dec(j);
end;
end;
close(g);
End;
BEGIN
init;
build;
result;
END.

Bi 3: Dy con c tng bng S


Cho dy a 1, a2,.. an. Tm mt dy con ca dy c tng bng S.
D liu: vo t file vn bn "tongs.inp" c dng :
- Dng u tin l 2 s N, S (N<200);
- Dng th hai l N s Ai (i=1, 2,.., N; -32000 <= A i <=32000).
Kt qu: Ghi ra file vn bn "tongs.out" c dng:
- Cc phn t thuc dy con tm c
V d:
tongs.inp

Tongs.out

8 39

19 20

19 5 20 13 16 20 18 2

* Hng dn:

17

t L(i,t)=1 nu c th to ra tng t t mt dy con ca dy gm cc


phn t a1,a2,..ai. Ngc li th L(i,t)=0. Nu L(n,S)=1 th p n ca bi ton
trn

'c'.

Ta c th tnh L(i,t) theo cng thc: L(i,t) = 1 nu L(i - 1,t)=1 hoc L(i-1,t a[i])=1.
* Chng trnh ci t:
Program day_con_tong_s;
uses crt;
const fi='tongs.inp';
fo='tongs.out';
max=6400;
maxn=200;
type arrA=array[1..maxn]of longint;
arrB=array[0..max]of longint;
var

f:text;
n:longint;
a,truoc:arrA;
s:longint;
d:arrB;

procedure
var

init;

i:longint;

begin
assign(f,fi);
reset(f);
readln(f,n,s);
for i:=1 to n do
18

read(f,a[i]);
close(f);
end;
procedure
var

process;

i,j:longint;

begin
for i:=1 to s do d[i]:=0;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
truoc[j]:=i;
end;
if d[s]<>0 then exit;
end;
end;
procedure inkq;
var i:longint ;
begin
assign(f,fo);rewrite(f);
if d[s]=0 then write(f,'0')
else
begin
i:=truoc[s];
19

while s<>a[i] do
begin
write(f,a[i],' ');
s:=s-a[i];
i:=truoc[s];
end;
write(f,a[i]);
end;
close(f);
end;
BEGIN
init;
process;
inkq;
END.

Bi 4: Xp vt vo ba l (mi vt ch c 1)
Mt chic ba l c th cha c mt khi lng khng qu W. C N
vt c nh s t 1 n N, vt i c khi lng Ai v gi tr s dng Ci (i=1,
2, ,N). Hy chn cc vt xp vo ba l sao cho tng gi tr cc vt
trong ba l l ln nht (nu c th xp c).
D liu: vo t file vn bn BALO.INP c cu trc nh sau:
Dng u ghi 2 s nguyn dng N, W (0 < N,W < 100).
Dng th i+1, vi i=1,2,..,N, ghi 2 s nguyn dng Ai v Ci tng ng l
khi lng v gi tr s dng ca vt th I (0 < Ai, Ci < 256).
Kt qu: Ghi ra file vn bn BALO.OUT c cu trc:
Dng u ghi tng gi tr s dng ln nht tm c.
20

Dng 2 ghi ch s cc vt c xp vo ba l.
V d:
BALO.INP

BALO.OUT

7 20

40

3 9

1 2 6 7

8 23
23 4
29 34
12 4
1 2
8 6
*Hng dn
Gi L(i,t) l tng gi tr ln nht khi c chn i vt t 1 n i cho vo
bal vi tng khi lng khng vt qu t.
L(n,m) s l p s ca bi ton (l gi tr ln nht c c nu chn n vt
v tng khi lng khng vt m).
Cng thc tnh L(i,t) nh sau:
L(i,0)=0; L(0,t)=0.
L(i,t)=L(i1,t) nu t<Ai.
L(i,t)=max(L(i1,t), L(i1,tai)+bi) nu t ai. Trong : L(i1,t) l gi tr c
c nu khng a vt i vo bal, L(i1,tai)+bi l gi tr c c nu chn vt
i.
Ta c th dng mt mng 2 chiu lu bng phng n, tuy nhin d a
trn nhn xt rng tnh dng i ca bng phng n ch cn dng i1, ta ch
cn dng 2 mng mt chiu P v L c ch s t 0 n m lu 2 dng . on
chng trnh con tnh bng phng n nh sau.
21

L[t] := 0; {vi mi t}
for I := 1 to n do begin
P:=L;
for t := 0 to m do
if t< L[t]:="P[t]" then> else L[t] := max(P[t],P[t a[i]]);
end;
Nu k bn s thy rng on trnh trn ch vit ging cng thc
QH ch cha ti u. Chng hn c lnh gn P:=L, sau li c gn
L[t]:=P[t] vi cc gi tr t < a[i] l khng cn thit. Bn c c th t ci tin
chng trnh ti u hn. Chi ph khng gian ca cch ci t trn l O(m) v chi
ph thi gian l O(n.m).
*Chng trnh ci t:
program

xep_do_vat;

uses crt;
const fi='balo.inp';
fo='balo.out';
max=10000;
type arrA=array[1..max]of longint;
arrB=array[0..max]of longint;
var

f:text;
n,w,kq,luu:longint;
a,c :arrA;
d,gt:arrB;
truoc:arrA;

procedure
var

init;

i:longint;
22

begin
assign(f,fi);
reset(f);
readln(f,n,w);
for i:=1 to n do
readln(f,a[i],c[i]);
for i:=1 to w do
begin
d[i]:=0;
truoc[i]:=0;
gt[i]:=0;
end;
close(f);
kq:=0;
end;
procedure
var

process;

i,j:longint;

begin
d[0]:=1; gt[0]:=0;
for i:=1 to n do
begin
for j:=w downto a[i] do
if (d[j-a[i]]=1) then
if gt[j-a[i]]+c[i]>gt[j] then
begin
d[j]:=1;
23

gt[j]:=gt[j-a[i]]+c[i];
truoc[j]:=i;
if gt[j]>kq then
begin
kq:=gt[j];
luu:=j;
end;
end;
write(i,' ',truoc[87]);
readln;
end;
end;
procedure

inkq;

var i :longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
i:=truoc[luu];
while luu>a[i] do
begin
write(f,i,' ');
luu:=luu-a[i];
i:=truoc[luu];
end;
write(f,i);
24

close(f);
end;
BEGIN
init;
process;
inkq;
END.

25

Chng III: Bi tp chn lc


Bi 5: B tr phng hp;
C n cuc hp nh s t 1 n n ng k lm vic ti mt phng hi
tho. Cuc hp i cn c bt u ti thi im si v kt thc ti thi im fi .
Hi c th b tr phng hi tho phc v c nhiu nht bao nhiu cuc hp
sao cho khong thi gian lm vic ca hai cuc hp c nhn phc v ch c
th giao nhau ti u mt.
D liu: vo t file vn bn ACTIVITY.INP
Dng du tin cha s nguyn dng n (n <= 1000000)
Dng th i trong s n dng tip theo cha hai s nguyn dng s i, fi (si, fi
<= 32000), i=1,2, ,n
Kt qu: Ghi ra file vn bn ACTIVITY.OUT
Dng u tin ghi s k l s lng cuc hp c chp nhn phc v;
Mi dng trong K dng tip theo ghi ch s ca mt trong k cuc hp c
chp nhn
V d:
ACTIVITY.INP

ACTIVITY.OUT

13

24

16

35
79

26

* Hng dn:
Sp xp cc cuc hp tng dn theo thi im kt thc (bi). Th th cuc
hp i s b tr c sau cuc hp j nu v ch nu j < i va` b j ai. Yu cu b tr
c nhiu cuc hp nht c th a v vic tm dy cc cuc hp di nht
tho mn iu kin trn
* Chng trnh ci t:
program

bo_tri_phong_hop;

uses crt;
const fi='activity.inp';
fo='activity.out';
max=1000000;
type arrA=array[1..max]of longint;
arrB=array[1..max,1..max]of longint;
var

f:text;
n,luu,kq,dem:longint;
a,b,truoc,cs:arrA;
d,k:arrA;

procedure
var

init;

i:longint;

begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
readln(f,a[i],b[i]);
27

cs[i]:=i;
end;
close(f);
end;
procedure
var

sap_xep;

i,j,tg:longint;ok:boolean;

begin
for i:=1 to n-1 do
begin
ok:=true;
for j:=n downto i+1 do
if b[j]<b[j-1] then
begin
tg:=b[j];b[j]:=b[j -1];b[j-1]:=tg;
tg:=a[j];a[j]:=a[j-1];a[j-1]:=tg;
tg:=cs[j];cs[j]:=cs[j -1];cs[j-1]:=tg;
ok:=false;
end;
if ok then exit;
end;
end;
procedure

process;

var i,j:longint;
begin
d[1]:=1;
for i:=1 to n do
28

truoc[i]:=i;
for i:=2 to n do
begin
d[i]:=1;
for j:=1 to n-1 do
if b[j]<=a[i] then
if d[j]+1>d[i] then
begin
d[i]:=d[j]+1;
truoc[i]:=j;
end;
end;
kq:=-1;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
while luu<>truoc[luu] do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure

inkq;

var i:longint;
29

begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
writeln(f,cs[k[i]]);
close(f);
end;
BEGIN
init;
sap_xep;
process;
inkq;
END.

Bi 6: Cho thu my tnh;


Ti thi im 0, ng ch cho thu my tnh nhn c n t hng thu
s dng ca N khch hng. Cc khch hng c nh s t 1 n N. Khch
hng i cn s dng my t thi im di n thi im ci (di v ci l cc s
nguyn v 0 < di < ci < 1000000000), v s tr tin s dng my l pi (pi
nguyn, 0 < pi < 10000000);
Yu cu: Hy xc nh xem ng ch cn nhn phc v nhng khch hng
no sao cho khong thi gian s dng my tnh ca hai khch hng c nhn
phc v bt k khng giao nhau v tng tin thu c t phc v l ln nht.
D liu: vo t file vn bn RENTING.INP. Dng u tin ghi s N (0 < N <
1000). Dng th i trong N dng tip theo ghi ba s di, ci, pi cch nhau bi du
trng, i=1,2,..,N.
30

Kt qu: Ghi ra file vn bn RENTING.OUT. Dng u tin ghi hai s


nguyn dng theo th t l s lng khch hng nhn c phc v v tng
tin thu c. Dng tip theo ghi ch s ca khch hng c phc v.
V d:
RENTING.INP

RENTING.OUT

RENTING.INP

RENTING.OUT

2 180

2 1100

150 500 150

2 3

400 821 800

2 4

200 100

200 513 500

400 800 80

100 325 200


600 900 600

*Hng dn:
Tng t nh bi ton 2, nu sp xp cc n t hng theo thi im
kt thc, ta s a c bi ton 3 ny v bi ton tm dy con c t ng ln
nht.
* Chng trnh ci t:
program cho_thue_may_tinh;
uses crt;
const fi='renting.inp';
fo='renting.out';
max=1000;
type arrA=array[1..max]of int64;
arrB=array[1..max,1..max]of longint;
var

f:text;
a,b,c:arrA;
n,kq,luu,dem:longint;
31

d,cs,truoc,k:arrA;
procedure
var

init;

i:longint;

begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
readln(f,a[i],b[i],c[i]);
cs[i]:=i;
end;
close(f);
end;
procedure
var

sap_xep;

i,j,tg:longint;ok:boolean;

begin
for i:=1 to n-1 do
begin
ok:=true;
for j:=n downto i+1 do
if b[j]<b[j-1] then
begin
tg:=b[j];b[j]:=b[j -1];b[j-1]:=tg;
tg:=a[j];a[j]:=a[j -1];a[j-1]:=tg;
tg:=cs[j];cs[j]:=cs [j-1];cs[j-1]:=tg;
32

tg:=c[j];c[j]:=c[j -1];c[j-1]:=tg;
ok:=false;
end;
if ok then exit;
end;
end;
procedure

process;

var i,j:longint;
begin
d[1]:=c[1];
for i:=1 to n do
truoc[i]:=i;
for i:=2 to n do
begin
d[i]:=c[i];
for j:=1 to n-1 do
if b[j]<=a[i] then
if d[j]+c[i]>d[i] then
begin
d[i]:=d[j]+c[i];
truoc[i]:=j;
end;
end;
kq:=-1;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
33

while luu<>truoc[luu] do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure

inkq;

var i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,dem,' ',kq);
for i:=dem downto 1 do
write(f,cs[k[i]],' ');
close(f);
end;
BEGIN

init; sap_xep;
process;
inkq;

END.

Bi 7: Ni im
Trn hai ng thng song song L1 v L2 ng i ta nh du trn mi
ng N im. Cc im trn ng thng L1 c nh s t 1 n N t tri
34

sang phi, cn cc im trn ng thng l2 c nh s p1, p2, , pN cng


t tri qua phi vi p1, p2, , pN l mt hon v ca 1, 2, , N (Hnh v di
y cho mt v d khi N=9):

Ta gi cc s gn cho cc im l s hiu ca chng. Cho php ni hai


im trn hai ng thng c cng s hiu.
Yu cu tm cch ni c nhiu cp im nht vi iu kin cc on
ni khng c ct nhau.
D liu: vo t file vn bn WIRE.INP c cu trc nh sau:
Dng u tin cha s nguyn dng N (N < 1000);
Dng th hai cha cc s nguyn p1, p2, , pN cch nhau b i du trng;
Kt qu: Ghi ra file vn bn WIRE.OUT c cu trc:
Dng u tin cha s k l s lng cc on ni tm c;
Dng tip theo cha k s hiu ca cc u mt ca cc on ni c ghi
theo th t tng dn.
V d:
WIRE.INP

WIRE.OUT

2 5 3 8 7 4 6 9 1

3 4 6 9

*Hng dn:
y chnh l bi ton 1: Tm dy con khng gi m di nht
* Chng trnh ci t:
program day_con;
uses crt;
35

const fi='wires.inp';
fo='wires.out';
max=1000;
type arrA=array[0..max]of longint;
arrB=array[1..max,1..max]of longint;
var

f:text;
a:arrA;
n,kq,luu,dem:longint;
d,truoc,k:arrA;

procedure
var

init;

i:longint;

begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure
var

process;

i,j:longint;

begin
for i:=1 to n do
truoc[i]:=i;
d[1]:=1;
for i:=1 to n do
36

begin
d[i]:=1;
for j:=1 to i-1 do
if a[i]>=a[j] then
if d[j]+1>d[i] then
begin
d[i]:=d[j]+1;
truoc[i]:=j;
end;
end;
kq:=0;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
dem:=0;
while truoc[luu]<>luu do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure
var

inkq;

i:longint;

begin
37

assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,a[k[i]],' ');
close(f);
end;
BEGIN
init;
process; inkq;
END.

Bi 8: Dy con i chiu, i du di nht;


Cho dy a 1, a2,... an. Hy tm dy con i chiu di nht ca dy . Dy
con con i du ai1,ai2,... aik phi tho mn cc iu kin sau:
ai1 < ai2 > ai3 <... hoc ai1 > ai2 < a i3 >... cc ch s phi cch nhau t nht L: i2
- i1 L, i3 -i2 L... chnh lch gia 2 phn t lin tip nh hn U: |a i1 - ai2| U,
|ai2 - ai3| U...
V d: Cho dy 10 phn t: -1, 3, -4, 13, 6, 9, -2, 12, -3, 15 v L=2 v U=3
C 1 dy con i chiu di nht l: -1, -4, -2, -3
D liu: Vo t file vn bn DOICHIEU.INP c cu trc nh sau:
Dng u tin ghi 3 s nguyn dng n, L, U (n <105; 1<L<n-1; 0 < U <
1000);
Cc dng tip theo ghi n s ca dy a; (|a i| <= 32000);
Kt qu: Ghi ra file vn bn DOICHIEU.OUT c cu trc nh sau:
Dng u l di dy con i chiu di nht tm c;
Ch s cc phn t ca dy con tm c trong dy ban u;
38

V d:
DOICHIEU.INP

DOICHIEU.OUT

10 2 3

-1 3 -4 13 6 9 -2 12 -3 15

1 3 7 9

* Hng dn:
Gi L(i) l s phn t ca dy con i du c phn t cui cng l a i v
phn t cui cng ln hn phn t ng trc. Tng t, P(i) l s phn t
ca dy con i du c phn t cui cng l a i v phn t cui cng nh hn
phn t ng trc. Ta d dng suy ra:
L(i) = max(1, P(j)+1): j i - L v ai - U aj < ai.
P(i) = max(1, L(j)+1): j i - L v ai < aj ai + U.
* Chng trnh ci t:
program

day_con_doi_chieu_dai_nhat;

uses crt;
const fi='doichieu.inp';
fo='doichieu.out';
max=100000;
type arrA=array[1..max]o f longint;
arrB=array[1..max,1..max]of longint;
var

f:text;
n,l,u,luu,kq,cs,dem:longint;
a:arrA;
d1,d2,truoc1,truoc2,k:arrA;

procedure
var

init;

i:longint;

begin
39

assign(f,fi);
reset(f);
readln(f,n,l,u);
for i:=1 to n do
begin
read(f,a[i]);
truoc1[i]:=i;
truoc2[i]:=i;
end;
close(f);
end;
procedure
var

process;

i,j:longint;ok:boolean;

begin
d1[1]:=1;
d2[1]:=1;
for i:=2 to n do
begin
d1[i]:=1;
for j:=1 to i-l do
if a[i]>=a[j] then
if abs(a[i]-a[j])<=U then
if d2[j]+1>d1[i] then
begin
d1[i]:=d2[j]+1;
truoc1[i]:=j;
40

end;
d2[i]:=1;
for j:=1 to i-l do
if a[i]<=a[j] then
if abs(a[i] -a[j])<=U then
if d1[j]+1>d2[i] then
begin
d2[i]:=d1[j]+1;
truoc2[i]:=j;
end;
end;
kq:=-1;
for i:=1 to n do
begin
if d1[i]>kq then begin kq:=d1[i];cs:=1;luu:=i;end;
if d2[i]>kq then begin kq:=d2[i];cs:=2;luu:=i;end;
end;
end;
procedure

truy_xuat;

var ok:boolean;
begin
ok:=false;
dem:=0;
repeat
inc(dem);
k[dem]:=luu;
41

if cs=1 then
begin
if luu=truoc1[luu]then
exit
else
begin
luu:=truoc1[luu];
cs:=2;
end;
end
else
begin
if luu=truoc2[luu] then
exit
else
begin
luu:=truoc2[luu];
cs:=1;
end;
end;
until ok;
end;
procedure
var

inkq;

i:longint;

begin
assign(f,fo);
42

rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,k[i],' ');
close(f);
end;
BEGIN

init; process;
truy_xuat; inkq;

END.

Bi 9: S php bin i t nht


Cho 2 xu X,Y. C 3 php bi n i vi xu X: chn 1 k t, thay th mt k
t hoc xo mt k t. Hy tm s t nht cc php bin i bin xu X
thnh

xu

Y.

V d: Cho xu X=kitten v Y=sitting th c n t nht l 3 php bin i


D liu: Vo t file vn bn BIENDOI.INP c cu trc nh sau:
Dng 1 cha xu X
Dng 2 cha xu Y
(Mi xu c khng qu 200 k t)
Kt qu: Ghi ra file vn bn BIENDOI.OUT ghi 1 s l s php bin i t
nht tm c;
V d:
BIENDOI.INP

BIENDOI.OUT

kitten

sitting

* Hng dn:
43

Gi F(i,j) l s php bin i t nht bin xu X(i) gm i k t phn u


ca X (X(i)= X[1..i]) thnh xu Y(j) g m j k t phn u ca Y (Y(j) =Y[1..j]). D
thy F(0,j)=j v F(i,0)=i.
Nu X[i]=Y[j] th ta ch phi bin i xu X(i-1) thnh xu Y(j-1). Do
F(i,j)=F(i-1,j-1).
Ngc li, ta c 3 cch bin i:
- Xo k t X[i] v bin i xu X(i-1) thnh Y(j). Khi F(i,j)=F(i -1,j)+1.
- Thay th X[i] bi Y[j] v bin i X(i-1) thnh Y(j-1). Khi F(i,j)=F(i1,j-1)+1.
- Chn Y[j] vo X(i) v bin i X(i) thnh Y(j-1). Khi F(i,j)=F(i,j-1)+1.
Tng kt li, ta c cng thc QH:
F(0,j)=j
F(i,0)=i
F(i,j) =F(i - 1,j - 1) nu X[i] = Y[j].
F(i,j) = min(F(i - 1,j),F(i,j - 1),F(i - 1,j - 1))+1 nu X[i] Y[j].
*Chng trnh ci t:
program bien_doi_xau;
uses crt;
const fi='biendoi.inp';
fo='biendoi.out';
max=100;
type arrA=array[1..max]of char;
arrB=array[0..max,0..max]of longint;
var

f:text;
m,n:longint;
d:arrB;
44

a,b:arrA;
procedure

init;

begin
assign(f,fi);
reset(f);
m:=0;
while not eoln(f) do
begin
inc(m);read(f,a[m]);
end;
readln(f);
n:=0;
while not eof(f) do
begin
inc(n);read(f,b[n]);
end;
close(f);
end;
function min3so(x,y,z:longint):longint;
var tam:longint;
begin
if x<y then tam:=x
else tam:=y;
if z<tam then tam:=z;
min3so:=tam;
end;
45

procedure
var

process;

i,j:longint;

begin
for i:=1 to m do d[i,0]:=i;
for j:=1 to n do d[0,j]:=j;
for i:=1 to m do
for j:=1 to n do
begin
if a[i]=b[j] then d[i,j]:=d[i -1,j-1]
else
d[i,j]:=min3so(d[i -1,j-1],d[i,j-1],d[i-1,j])+1;
end;
end;
procedure

inkq;

begin
assign(f,fo);
rewrite(f);
writeln(f,d[m,n]);
close(f);
end;
BEGIN
init;
process;
inkq;
END.

46

Bi 10: Xu i xng;
Mt xu gi l xu i xng (palindrom) nu xu c t tri sang phi
hay t phi sang tri u nh nhau. Cho mt xu S, hy tm s k t t nht cn
thm vo S S tr thnh xu i xng.
V d: Cho xu S=abcda th s k t t nht cn chn thm l 2
D liu: Vo t file vn bn XDX.INP l 1 xu S c khng qu 500 k t )
Kt qu: Ghi ra file vn bn XDX.OUT l s lng k t t nht cn thm;
V d:
XDX.INP

XDX.OUT

abcda

*Hng dn:
Gi L(i,j) l s k t t nht cn thm vo xu con S[i..j] c a S xu tr
thnh i xng. p s ca bi ton s l L(1,n) vi n l s k t ca S. Ta c
cng thc sau tnh L(i,j):
L(i,i)=0.
L(i,j)=L(i+1,j - 1) nu S[i]=S[j]
L(i,j)=max(L(i+1,j), L(i,j - 1)) nu S[i] S[j] ;
Ta c thut ton n gin hn nh sau:
Gi P l xu o ca S v T l xu con chung di nh t ca S v P. Khi
cc k t ca S khng thuc T cng l cc k t cn thm vo S tr thnh i
xng. p s ca bi ton s l n - k, vi k l di ca T. V d:
S=<b>edbabcd, xu o ca S l P=<b>dcbabde. Xu con chung di nh t ca S
v P l T=<b>dbabd. Nh v y cn thm 2 k t l e v c vo S tr thnh xu
i xng;
*Chng trnh ci t:
program xau_doi_xung;
47

uses crt;
const fi='palin.inp';
fo='palin.out';
max=5000;
type arrA=array[1..max]of char;
arrB=array[1..max,1..max]of longint;
var

a:arrA;
l:arrB;
f:text;
n:integer;

procedure

init;

var i:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]);
close(f);
end;
function min2so(x,y:longint):longint;
begin
if x>y then min2so:=y
else min2so:=x;
end;
procedure

process;

var i,j:longint;
48

begin
for i:=1 to n do
l[i,i]:=0;
for i:=1 to n-1 do
for j:=1 to n-i do
begin
if a[j]=a[j+i]then
begin
if i=1 then l[j,j+i]:=0
else
l[j,j+i]:=l[j+1,j+i -1];
end
else
l[j,j+i]:=min2so(l[j+1,j+i],l[j,j+i -1])+1;
end;
end;
procedure

inkq;

begin
assign(f,fo);
rewrite(f);
writeln(f,l[1,n]);
close(f);
end;
BEGIN
init;
process;
49

inkq;
END.

Bi 11: Bi ton chia ko


C N gi ko, gi th i c Ai ci ko. Khng c bc bt k mt gi ko
no, cn chia N gi ko thnh hai phn sao cho chnh lch s ko gia hai
gi l t nht.
D liu:Vo t file vn bn "chiakeo.inp" c dng :
- Dng u tin l s N (N<=100);
- Dng th hai l N s Ai (i=1, 2,.., N; A i <=100).
Kt qu: Ghi ra file vn bn "chiakeo.out" c dng:
- Dng u l chnh lch nh nht gia hai phn c th c.
- Dng th hai l cc ch s ca ca cc phn t trong dy a thuc phn
1;
- Dng th ba l cc ch s ca cc phn t trong dy a thuc phn 2 ;
V d:
CHIAKEO.INP

CHIAKEO.OUT
8
1 56 57
19 5 20 13 16 20 18 2 3 5 6
12478
*Hng dn:
Gi T l tng s ko ca n gi. Chng ta cn tm s S ln nht tho mn:
S T/2.
C mt dy con ca dy a c tng bng S. Khi s c cch chia vi
chnh lch 2 phn l T- 2S l nh nht v dy con c tng bng S trn gm
cc phn t l cc gi ko thuc phn th nht. Phn th hai l cc gi ko
cn li.
* Chng trnh ci t:
program

chia_keo;
50

uses crt;
const fi='chiakeo.inp';
fo='chiakeo.out';
max=100;
var

a:array[1..max]of integer;
n:integer;
t,k:integer;
s:array[0..max,0..10000]of integer;
f:text;
t1,lech:integer;
cx:array[1..max]of boolean;

procedure

init;

var i:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
k:=0;
for i:=1 to n dok:=k+a[i];
t:=k div 2;
for i:=1 to n do s[i,0]:=1;
for i:=1 to t do s[0,i]:=0;
for i:=1 to n do cx[i]:=true;
51

end;
procedure

process;

var i,j:integer;
begin
for i:=1 to n do
for j:=1 to t do
begin
s[i,j]:=0;
if s[i-1,j]=1 then s[i,j]:=1;
if j>=a[i] then
if s[i-1,j-a[i]]=1 then s[i,j]:=1;
end;
end;
procedure xu_li;
var i,j:integer;
begin
for i:=t downto 1 do
begin
for j:=1 to n do
if s[j,i]=1 then
begin
t1:=i;
lech:=k-2*i;
exit;
end;
end;
52

end;
procedure

truy_ket_qua;

var tam,i,t2:integer;
begin
tam:=t1;
t2:=n;
repeat
for i:=1 to t2 do
if s[i,tam]=1 then
begin
t2:=i;
tam:=tam-a[i];
cx[i]:=false;
break;
end;
until (tam=0);
end;
procedure

inkq;

var i:integer;
begin
assign(f,fo);
rewrite(f);
writeln(f,lech,' ',t1,' ',k-t1);
for i:=1 to n do if cx[i]=false then write(f,i,' ');
writeln(f);
for i:=1 to n do if cx[i]=true then write(f,i,' ');
53

close(f);
end;
BEGIN
init;
process;
xu_li;
truy_ket_qua;
inkq;
END.

Bi 12: Mua c theo lng (Olympic Balkan 2000) ;


Ngi nh c Clement bt c n con c, khi lng mi con l a i, em
bn ngoi ch. ch c, ngi ta khng mua c theo t ng con m mua theo
mt lng no v mt con c bt k khng c ct ra. Chng hn 3 kg,
5kg...
V d: c 3 con c, khi lng ln lt l: 3, 2, 4. Mua lng 6 kg s phi
ly con c th 2 v v th 3. Mua lng 3 kg th ly con th nht. Khng th
mua lng 8 kg.
Nu bn l ngi u tin mua c, c bao nhiu l ng bn c th chn?
D liu vo: c t file vn bn MARKET.INP c cu trc:
- Dng u tin ghi s nguyn n (n <= 10 4) ;
- Cc dng tip theo ghi cc gi tr a i (i=1,2,..,n)
Kt qu ra: Ghi ra file vn bn MARKET.OUT ghi s l l s lng tm c.
V d:
MARKET.INP
3
3 2 4

MARKET.OUT
7

54

* Hng dn:
Thc cht bi ton l tm cc s S m c mt dy con ca dy a c tng
bng S. Ta c th dng phng php nh du ca bi chia ko trn ri m
cc gi tr t m L[t]=1.
* Chng trnh ci t:
program so_ca;
uses crt;
const fi='market.inp';
fo='market.out';
maxn=10000;
max=1000000;
type arrA=array[1..maxn]of longint;
arrB=array[0..max]of longint;
var

f:text;
a:arrA;
s,dem,n:longint;
d:arrB;

procedure

init;

var i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
s:=0;
for i:=1 to n do
begin
55

read(f,a[i]);
s:=s+a[i];
end;
close(f);
end;
procedure
var

process;

i,j:longint;

begin
for i:=1 to s do
d[i]:=0;
d[0]:=1;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
inc(dem);
end;
end;
end;
procedure

inkq;

begin
assign(f,fo);
rewrite(f);
writeln(f,dem);
56

close(f);
end;

Bi 13: in du hi vo biu thc


Cho n s t nhin a 1,a2,...,an. Ban u cc s c t lin tip theo ng
th t cch nhau bi du '?': a1?a2?...?an. Cho trc s nguyn S, c cch no
thay cc du '?' bng du + hay du - c mt biu thc s hc cho gi tr
l S khng?
D liu vo: c t file vn bn DAUHOI.INP c cu trc nh sau:
Dng u ghi 2 s nguyn dng n v S (n <=10 4, S<=105);
Cc dng tip theo ghi n gi tr a1, a2, , an
Kt qu ra: Ghi ra file vn bn DAUHOI.OUT c cu trc nh sau:
Dng u ghi 0 hoc 1 tng ng l khng c cch thay cc d u hi hoc
c tn ti cch thay du hi bng du + hay - gi tr ca biu thc bng S;
Nu dng 1 ghi s 1 th dng tip theo ghi 1 cch thay du hi bi php
ton + hoc - tm c (ch cn ghi cc du theo th t t tri sang phi)
V d:
DAUHOI.INP DAUHOI.OUT
5 20

45678

-+++

*Hng dn:
t L(i,t)=1 nu c th in du vo i s u tin v cho kt qu bng t.
Ta c cng thc sau tnh L:
L(1,a[1]) =1.
L(i,t)=1 nu L(i - 1,t+a[i])=1 hoc L(i - 1,t - a[i])=1.
Nu L(n,S)=1 th cu tr li ca bi ton l c. Khi ci t, c th dng
mt mng 2 chiu (lu ton b bng phng n) hoc 2 mng mt chiu (
57

lu dng i v dng i - 1). Ch l ch s theo t ca cc mng phi c c phn m


(tc l t - T n T, vi T l tng ca n s), v trong bi ny chng ta dng c
du - nn c th to ra cc tng m.
Bi ny c mt bin th l t du sao cho kt qu l mt s chia ht cho
k. Ta c thut gii tng t bi ton trn bng cch thay cc php cng, tr
bng cc hp cng v tr theo mun k v dng mng nh du vi cc gi tr
t 0 n k - 1 (l cc s d c th c khi chia cho k). p s ca bi ton l
L(n,0).

* Chng trnh ci t:
program

dau_hoi;

uses crt;
const fi='daudoi.inp';
fo='dauhoi.out';
max=10000;
maxs=100000;
type arrA=array[1..max]of longint;
arrB=array[0..maxs]of longint;
var

f:text;
n,s,tong:longint;
a:arrA;
d:arrB;
ok:boolean;
truoc:arrA;
co:array[1..max]of boolean;

procedure

init;
58

var
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,s);
tong:=0;
for i:=1 to s do
begin
read(f,a[i]);
tong:=tong+a[i];
co[i]:=true;
end;
ok:=true;
if tong<s then ok:=false;
tong:=tong-s;
if tong mod 2 <>0 then

ok:=false

else tong:=tong div 2;


close(f);
end;
procedure
var

process;

i,j:longint;

begin
for i:=1 to tong do
d[i]:=0;
d[0]:=1;
59

for i:=1 to n do
for j:=tong downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
truoc[j]:=i;
end;
if d[tong]<>0 then exit;
end;
end;
procedure

inkq;

var luu,i:longint;
begin
assign(f,fo);
rewrite(f);
if (d[tong]=0) or (truoc[tong]=1) then
ok:=false
else
begin
s:=tong;luu:=truoc[s];
while s<>a[luu] do
begin
co[luu]:=false;
s:=s-a[luu];
luu:=truoc[s];
60

end;
co[luu]:=false;
end;
if ok then
begin
writeln(f,'1');
for i:=2 to n do
begin
if co[i] then write(f,'+')
else write(f,'-');
end;
end
else write(f,'0');
close(f);
end;
BEGIN init;
if ok then process; inkq;
END.

Bi 14: Chia thnh hai nhm c tch ln nht (ACM 10690)


Cho n s nguyn. Hy chia chng thnh 2 nhm sao cho tch c a tng 2
nhm l ln nht.
D liu vo: c t file vn bn EXPRESSION.INP c cu trc nh sau:
- Dng u ghi 1 s nguyn dng n (n <=10 4);
- Cc dng tip theo ghi n gi tr a 1, a2, , an
Kt qu ra: Ghi ra file vn bn EXPRESSION.OUT c cu trc nh sau:
- Gi tr S l tch ln nht ca tng 2 nhm tm c;
61

V d:
EXPRESSION.INP

EXPRESSION.OUT

56

1 2 3 4 5

*Hng dn:
Gi T l tng n s nguyn . Gi s ta chia dy thnh 2 nhm, gi S l
tng ca mt nhm, tng nhm cn li l T - S v tch ca tng 2 nhm l S*(T S). Bng phng php nh du ta xc nh c mi s S l tng ca mt
nhm (nh bi Market) v t m s S sao cho S*(T - S) t max.
*Chng trnh ci t:
uses crt;
const fi='expression.inp';
fo='expression.out';
max=10000;
maxs=100000;
type arrA=array[1..max]of longint;
arrB=array[0..maxs]of longint;
var

f:text;
n,s,tong:longint;
a:arrA;
d:arrB;
ok:boolean;

procedure
var

init;

i:longint;
62

begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
read(f,a[i]);
tong:=tong+a[i];
end;
close(f);
end;
procedure
var

process;

i,j:longint;

begin
for i:=1 to s do
d[i]:=0;
d[0]:=1;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
d[j]:=1;
if d[s]<>0 then begin ok:=true;exit;end;
end;
end;
procedure

xu_li;
63

begin
s:=tong div 2 ;
while not ok do process;
end;
procedure

inkq;

begin
assign(f,fo);
rewrite(f);
if n<>1 then
write(f,(s+1)*(tong-s-1))
else writeln(f,'0');
close(f);
end;
BEGIN
init;
if n<>1 then xu_li;
inkq;
END.

Bi 15: Bi ton mua bn hng


C mt ngi i mua hng, anh ta c N ng tin d1, d2,.., dN. Ngi bn
hng c M ng tin b1, b2,.., bm. Anh ta mun mua mt mt hng vi gi tr W.
Hi cuc mua bn c th din ra c khng?
Gii hn: M, N<=100 v d i, bj <=100.
D liu vo c t file vn bn MUABAN.INP c cu trc nh sau:
- Dng u ghi 3 s nguyn dng N, M, W
- Dng th 2 ghi N s d 1, d2,.., dN;
64

- Dng th 3 ghi M s b 1, b2,.., bm;


Kt qu ghi ra file vn bn MUABAN.OUT c cu trc nh sau:
- Dng u ghi s 0 hoc 1 tng ng l khng th din ra cuc mua
bn hoc c th din ra cuc mua bn;
- Nu dng u l 1 th dng 2 ghi ch s cc ng tin m ngi mua
hng s dng trao i, cn dng 3 ghi ch s cc ng tin m
ngi bn hng s dng trao i;
V d:
MUABAN.INP

MUABAN.OUT

MUABAN.INP

MUABAN.OUT

6 10 30

4 3 30

5 7 6 11 2 26

1 2 3 4 5

6 11 2 26

1 2 3 5 6 7

10 20 30

8 9 10
* Chng trnh ci t:
program

mua_ban_hang;

uses crt;
const fi='muaban.inp';
fo='muaban.out';
max=100;
maxs=10000000;
type arrA=array[1..max]of longint;
arrB=array[0..maxs]of longint;
var

f:text;
a,b:arrA;
d:arrB;
n,m,w,tong,luu1,luu2,s,v:longint;
ok1,ok2,ok:boolean;
65

truoc1,truoc2:arrA;
procedure

init;

var i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,m,w);
tong:=0;
for i:=1 to n do
begin
read(f,a[i]);
tong:=tong+a[i];
end;
readln(f);
for i:=1 to m do
read(f,b[i]);
close(f);
end;
procedure
var

process1;

i,j:longint;

begin
for i:=1 to s do
begin
d[i]:=0;
truoc1[i]:=0;
end;
66

d[0]:=1;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
truoc1[j]:=i;
end;
if d[s]<>0 then begin ok1:=true;exit;end;
end;
end;
procedure
var

process2;

i,j:longint;

begin
d[0]:=1;
for i:=1 to v do
begin
d[i]:=0;
truoc2[i]:=0;
end;
for i:=1 to m do
for j:=v downto b[i] do
begin
if (d[j]=0) and (d[j -b[i]]=1) then
begin
67

d[j]:=1;
truoc2[j]:=i;
end;
if d[v]<>0 then begin ok2:=true; exit;end;
end;
end;
procedure

xu_li;

begin
ok:=false;
for s:=w to tong do
begin
ok1:=false;
process1;
if ok1 then
begin
ok2:=false;
v:=s-w;
if v=0 then ok2:=true
else
process2;
end;
if ok1 and ok2 then
begin
luu1:=s;
luu2:=v;
ok:=true;
68

break;
end;
end;
end;
procedure

inkq;

var i:longint;
begin
assign(f,fo);
rewrite(f);
if ok then
begin
writeln(f,'1');
i:=truoc1[luu1];
while luu1<>a[i] do
begin
write(f,i,' ');
luu1:=luu1-a[i];
i:=truoc1[luu1];
end;
writeln(f,i);
if luu2<>0 then
begin
i:=truoc2[luu2];
while luu2<>b[i] do
begin
write(f,i,' ');
69

luu2:=luu2-b[i];
i:=truoc2[luu2];
end;
write(f,i);
end;
end
else writeln(f,'0');
close(f);
end;
BEGIN
init;
xu_li;
inkq;
END.

Bi 16: Lch thu nhn cng


C mt d n ko di trong T thng v ng i qun l cn phi lp lch s
dng cng nhn trong d n, anh ta bit s cng nhn ti thiu cn trong mi
thng. Mi khi thu hay sa thi mt cng nhn th u phi mt mt chi ph
xc nh, mi cng nhn c thu s vn nhn c lng thng ngay c khi
khng s dng anh ta lm vic.
Vi mi cng nhn, ngi qun l bit chi ph thu, chi ph sa th i v tin
lng phi tr cho cng nhn trong 1 thng. V bi ton t ra nh sau: Cn
phi thu hay sa thi bao nhiu cng nhn mi thng tng chi ph dnh cho
nhn cng ca d n l nh nht, tc l gim ti a chi ph ca d n.
D liu vo: c t file vn bn EMPLOY.IN c cu trc nh sau:
- Dng u ghi T l s thng din ra d n (T=<100).
70

- Dng th hai ghi 3 s ln lt l chi ph thu, lng thng, chi ph sa th i


mi cng nhn.
- Dng cui cng l T s nguyn dng, s th i cho bit s cng nhn ti
thiu cn cho thng th i, cc gi tr s khng qu 150.
Kt qu ra: Ghi ra file vn bn EMPLOY.OUT theo nh dng:
- Dng th nht ghi tng chi ph nh nht tm c.
- Dng th hai ghi T s, s th i l s cng nhn hot ng trong d n ti
thng th i.
V d: v file d liu vo v file kt qu ra:
EMPLOY.IN

EMPLOY.OUT

265

456

10 10 11

10 9 11
* Hng dn:
bi ny hi rc ri kh hiu mt cht v vy cn phi c k, nm
chc. R rng vic thu thm hay sa thi cng nhn u phi chu ph tn nn
thy: m bo chi ph t nht cho vic thu nhn cng trong c d n th s
cng nhn ang thu trong mt thng khng nht thit phi l s cng nhn ti
thiu cn cho thng y. V d, ph tn thu cng nh sa thi cng nhn rt
ln th khng di g ta li thng xuyn thu ri li sa thi ngi trong tng
thng, tt nht nn gi hv tr lng (d h khng lm g). Nhim v ca
chng ta trong mi thng phi quyt nh c bao nhiu cng nhn trong bin
ch thu, ngha l phi quyt nh xem cn thu hay cn sa thi bao nhiu cng
nhn trong bin ch ca thng trc. Nu gi T_max l s cng nhn ca thng
cn nhiu ngi nht th r rng s cng nhn trong bin ch thu ca mt
thng bt k trong d n khng bao gi vt qu T_max. Xt mt thng no ,
71

bit rng khng nn s dng qu T_max ngi v cng khng c php s


dng t hn s ngi ti thiu cn cho thng y, nhng phi chn gi tr no
trong khong gii hn ny. n y nu cc gi tr ca T v T_max l nh th c
th duyt tm ra kt qu ti u nhng do ccgi tr ny li c th kh ln nn
buc phi tm cch khc hiu qu hn.
Lp mng Scn[1..T], Scn[i] cho bit s cng nhn ti thiu cn cho thng
th i, i=1..T(mng ny nhp vo t file input). Lp thm mng C[T,T_max]
trong C[i,j] cho bit chi ph ti thiu ca i thng u tin ca d n nu ti
thng th i c j cng nhn trong bin ch thu (i=1..T, =1..T_max). Th y l gi
tr C[i,j] cth xc nh thng qua cc gi tr C ti thng i-1 (l thng trc):
C[i,j] = Min{C[i-1,k] + chi ph t k ngi thnh j ngi }
( i=1..T;j=Scn[i]..T_max; k=Scn[i -1]..T_max)
Bi ton n gin hn nhiu khi c c cng thc truy hi v v
phc tp tnh ton khng ln nn chc chn chng trnh s ngn gn, cho kt
qu ti u trong thi gianrt ngn. Kt qu ti u cui cng l:
Kq = Min{C[T,j]+ chi ph sa th i j ngi}
(j=Scn[T]..T_max)
c th a ra kt qu y (s cng nhn s dng mi thng) th cn
thm mng hai chiu Pre, trong Pre[i,j] := k, v i i=1..T; j=Scn[i]..T_max; k
tho mn tng (C[i-1,k] + chi ph t k ngi thnh j ngi) nh nht. Vic
ln ngc tm kt qu trong mngPre khng kh.

Bi 17: Ct hnh ch nht


Ta cn ct mt hnh ch nht c kch thc M x N (M, N nguyn dng
khng ln hn 100) thnh mt s t nht cc hnh vung c kch thc nguyn
dng v c cnh song song vi cnh ca hnh ch nht ban u. Bit rng khi

72

ct mt hnh ch nht bt k ch ct c theo 1 phng song song vi mt


trong cc cc cnh ca hnh ch nht .
D liu vo: c t file vn bn CUT.INP c mt dng ghi 2 s M, N.
Kt qu ra: Ghi ra file CUT.OUT c cu trc nh sau:
Dng th nht ghi s K l s hnh vung t nht ct ra.
Dng th 2 ghi kch thc ca K hnh vung ct ra c, mi s cch nhau
1 du cch.
V d:
CUT.INP CUT.OUT
5

5 6

2 2 2 3 3

M t trn hnh v: (S ghi trong hnh vung cho bit kch thc ca hnh
vung )
2

*Hng dn:

2
3

2
3

+ Nu M = 1 th ct c t nht bao nhiu hnh vung tho mn?


+ Nu N = 1 th ct c t nht bao nhiu hnh vung tho mn?
+ Nu gi F[i,j] l s hnh vung t nht ct ra t hnh ch nht kch thc
i, j (vi 1 < i < M; 1 < j < N) th cng thc QH c xy dng nh th no?
Bi ton con c s: F[1,j] := j vi mi j; F[i,1] := i vi mi i
Cng thc QH:
Vi i := 2, .., m
Vi j := 2, .., n
Nu i = j th F[i,i] := 1
73

Tri li
t1 := min{F[k,j] + F[i-k, j]} vi k = 1,2, , i div 2;
t2 := min{F[i,k] + F[i, j-k]} vi k = 1,2, , j div 2;
F[i,j] := min{t1, t2}
*Chng trnh ci t:
program cut_hcn;
const fi='cut.inp';
fo='cut.out';
maxn=1001;
var

f:text;
m,n,t:integer;
q:array[1..maxn,1..maxn] of integer;

procedure
var

nhap;

i,j:integer;

begin
assign(f,fi);
reset(f);
readln(f,m,n);
for i:=1 to m do
for j:=1 to n do
q[i,j]:=-1;
close(f);
end;
procedure

xuli;

var min,l,k,i,j:integer ;
begin
74

for i:=1 to m do q[i,1]:=i;


for i:=1 to n do q[1,i]:=i;
for i:=2 to m do
for j:=2 to n do
if i=j then q[i,j]:=1
else
begin
min:=maxint;
for k:=1 to j div 2 do
if min>q[i,k]+q[i,j -k] then min:=q[i,k]+q[i,j-k] ;
for l:=1 to i div 2 do
if min>q[l,j]+q[i -l,j] then min:=q[l,j]+q[i-l,j] ;
q[i,j]:=min;
end;
{if i=-1 then
if (i mod j =0) or (j mod i =0) then
begin
if i>=j then q[i,j]:=i div j else q[i,j]:=j div i;
end
else
begin
min:=maxint;
for k:=1 to j div 2 do
if min>tinhq(i,k)+tinhq(i,j -k) then min:=tinhq(i,k)+tinhq(i,j k) ;
for l:=1 to i div 2 do
75

if min>tinh q(l,j)+tinhq(i-l,j) then


min:=tinhq(l,j)+tinhq(i -l,j) ;
q[i,j]:=min;
end;
tinhq:=q[i,j]; }
end;
procedure

timkq(i,j:integer);

var k,l,tg:integer;
begin
if (i mod j =0) or (j mod i =0) then
begin
if i>=j then for tg:=1 to i div j do write(f,j,' ')
else for tg:=1 to j div i do write(f,i,' ');
end
else
begin
for k:=1 to (j div 2) do
if q[i,j]=(q[i,k]+q[i,j -k]) then
begin
timkq(i,k);
timkq(i,j-k);
exit;
end ;
for l:=1 to (i div 2) do
if q[i,j]=(q[l,j]+q[i-l,j]) then
begin
76

timkq(l,j);
timkq(i-l,j);
exit;
end;
end;
end;
procedure

xuat;

var j,i:integer;
begin
assign(f,fo);
rewrite(f);
writeln(f,q[m,n]);
timkq(m,n);
close(f)
end;
BEGIN
nhap;
xuli;
xuat;
END.

Bi 18: Tr chi vi bng s: Rate This


Tr chi vi bng s l tr chi tham gia trng thng c m t nh
sau: C mt bng hnh ch nht c chia ra lm n vung, nh s t tri
qua phi bt u t 1. Trn vung th i ngi ta ghi mt s nguyn dng ai,
i = 1, 2, , n. mt lt chi, ngi tham gia tr chi c quyn la chn
mt s lng ty cc trn bng s. Gi s theo th t t tri qua phi,
77

ngi chi la chn cc i1, i2, , ik. Khi im s m ngi chi t c


s l:
ai1 ai2 + + (-1)k-1aik
Yu cu: Hy tnh s im ln nht c th t c t mt lt chi.
D liu vo: c t file vn bn Rate.inp c cu trc:
Dng u tin cha s nguyn dng n ( n 106 ) l s lng ca bng
s;
Dng th hai cha n s nguyn dng a 1, a2, , an ( ai 104, i = 1, 2, , n )
ghi trn bng s. Cc s lin tip trn cng dng c ghi cch nhau bi t nht
mt du cch.
Kt qu ra: Ghi ra file vn bn Rate.out c cu trc l:
Mt s nguyn duy nht l s im ln nht c th t c t mt lt
chi.
V d:
Rate.inp

Rate.out

17

4 9 2 4 1 3 7

Rng buc: 60% s tests ng vi 60% s im ca bi c 1 n 20.


*Chng trnh ci t:
program rate_this;
const fi='ratethis.inp';
78

fo='ratethis.out';
maxn=1000000;
var

f:text;
n,kq,dem:int64;
a,fl,fc,ds:array[1..maxn] of int64;
luuc,luul:array[1..maxn] of integer;

procedure
var

nhap;

i:longint;

begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]) ;
close(f);
dem:=0;
fillchar(luul,sizeof(luul),0);
fillchar(luuc,sizeof(luuc),0);

end;
function

max2so(cl,j,x,y:int64):int64;

begin

if x>y then max2so:=x


else begin
max2so:=y;
79

if cl=0 then luuc[j]:=1;


if cl=1 then luul[j]:=1;
end;

end;
procedure

xuli;

var i,chanle:longint;
begin
fl[1]:=a[1];
fc[1]:=0;
for i:=2 to n do
begin
fl[i]:=max2so(1,i,fl[i -1],fc[i-1]+a[i]);
fc[i]:=max2so(0,i,fc[i -1],fl[i-1]-a[i]);
end;
if fl[n]>fc[n] then begin kq:=fl[n];chanle:=1;end
else begin kq:=fc[n];chanle:=0;end;
for i:=n downto 1 do
begin
if (chanle=1) and (luul[i]=1) then
begin
inc(dem);
ds[dem]:=i;
chanle:=0;
continue;
end;
80

if (chanle=0) and (luuc[i]=1) then


begin
inc(dem);
ds[dem]:=i;
chanle:=1;
end;
end;

end;
procedure

xuat;

var i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,ds[i],' ');
close(f)
end;

BEGIN
nhap;
xuli;
xuat;
END.

81

Bi 19: Con kin


Trn mt sn hnh ch nht MxN, c chia thnh cc vung n v ,
mi cha mt lng thc n. Mt con kin xut pht t (1,1) mun i qua
sn n dng th M. Con kin ch c th i theo mt dngchia nh trn sn
ng vi mt dng ca bng ch nht hoc i theotrn mt ct ca sn. Hy ch
ra ng i gip con kin c c nhiu thc n nht.
D liu vo: c t file vn bn FOOD.INP c cu trc:
Dng u l 2 s M, N.
M dng tip theo, mi dng c N s tng ng l lng thc n c trong
M x N trn sn.
Kt qu ra: Ghi ra file vn bn FOOD.OUT c cu trc:
Dng u l tng lng thc n nhiu nht m con kin c th n c.
Cc dng tip theo, mi dng l 2 s tng ng l to dng, ct ca
m con kin i qua.
V d:
FOOD.INP
35

FOOD.OUT
45
1 1
2 1
2 2
2 3
82

3 3
*Hng dn:
Trng s y l lng thc n trn mi .
Quy tc i:

D dng tm c cng thc quy hoch ng l:


Gi B[i,j] l lng thc n ln nht i t (1,1) n (i,j)
B[1,j]= A[1,j] vi j = 1..N
B[i,1]= A[i,1]+B[i-1,1] vi i = 2..M
B[i,j]=Max{B[i-1,j],B[i,j-1]} + A[i,j] vi i = 2..M v j = 2..N

Bi 20: Sa mc
Mt bi sa mc c dng hnh ch nht MxN. Mi vung n v trn sa
mc c mt cao no . Mt ngi mun i t b u ny sang bcui
cng bn kia. Ngi ch c th i t ang ng ti mt mi theo hng
thng ng cho tri hoc cho phi. Gi thit rng ngi khng c
vt ra hai mp tri v phi ca sa mc.
Hytm ng i sao cho ngi phi vt qua qung ng ngn
nht. Mi ln i t mt sang mi tip theo ngi phi i ht qung
ng bng chnh cao gia hai .

83

SAMAC.INP

SAMAC.OUT
12(Qung ng Min)
(1,3)(2,4) (3,3) (4,2) (5,2)
*Hng dn:
Trng s l chnh cao gia hai lin tip.
Quy tc i.

Cng thc ti u:
B[i,j] l qung ng nh nht i t b u tin n (i,j).
B[1,j]= 0 vi j = 1..N
B[i,1]= Min { B[i-1,1] + abs(A[i,1] - A[i-1,1]), B[i-1,2]+ abs(A[i,1] - A[i-1,2])}
Vi i = 2..M
B[i,j]= Min { B[i-1,j -1] + abs(A[i,j] - A[i-1,j -1]),B[i-1,j] + abs(A[i,j] - A[i-1,j]),
B[i-1,j+1] + abs(A[i,j] - A[i-1,j+1])} Vi i = 2..M, j = 2..N-1
B[i,N] = Min { B[i-1,N] + abs(A[i,N] - A[i-1,N]), B[i-1,N-1]+ abs(A[i,N] - A[i1,N-1])}, Vi i = 2..M.

84

Bi 21: Quy bn hng.


Mt siu th c M gian hng, mi gian hng gm N ngn cha, mi ngn
cha c b tr mt phng. Gim c siu th quyt nh m mt t
khuyn mi cho khch hng vi cc quy tc sau:
Mi gian hng c b tr trn tng tng tng ng t tng 1 n M.
Mi tng c N thang my i ln ng vi mi phng.
Mt khch hng c th mua sn phm ti mt gian hng nhng ch c th
i theo mt hng (khng c mua xong ri quay tr li ni mua).
Khch hng c th i thang my ln tng tip theo, nhng phi mua t nht ti
mt ngn cha tng th mi c php i ln tng trn na.
Khch hng mua hng ti mt ngn cha. Mi ngn cha quy nh mt s
lng hng m ngi khch buc phi mua khi n ngn cha .
Nu chnh s lng hng gia hai ngn cha lin tip ca mt khch hng
l mt s may mn bit trc. Khch hng s c khuyn mi thm
mt s hng bng chnh s may mn .
n tng th M, khch hng ch c th mua hng ti duy nht mt ngn
cha.
Hy gip khch hng la chn im xut pht v hng i sao cho mua
c nhiu hng nht (K c s hng c khuyn mi).
D liu u vo cho trong FILE vn bn SHOP.INPc cu trc nh sau:
Dng u l 3 s M,N, K (1<M, N, K 100), K l s cc con s may mn.
Dng th hai ghi K con smay mn.
M dng tip theo ghi s lng hng quy nh ti mi ngn cha. Mi
dng gm N s cch nhau bi t nht mt du trng.
Kt qu ghi ra FILE vn bn SHOP.OUT nh sau:
Dng mt l slng hng nhiu nht.
85

Dng hai im xut pht v qu trnh mua hng. M i ngn cha i qua
c biu din theo dng (x,y) trong (x,y) l v tr ca ngn cha.
V d:
SHOP.INP

SHOP.OUT
80 (Lng hng mua c Max)
(1,3) (1,2) (2,2) (2,1) (3,1) (3,2) (3,3) (3,4) (4,4)
*Hng dn:
Trng s y l s lng hng ti cc ngn cha. ng thi khi tho
mn iu kin khuyn mi th trng s s c tng thms lng bng s
cc con s may mn (ph thuc vo ng trc).
Quy tc i:

:
Cng thc quy hoch ng:
B[i,j] l lng hng max khi i t tng 1 cho n ngn cha (i,j)
B[0,j]= 0 vi j =1..N
B[i,0]= 0 vi i =1..M
86

B[i,j]= Max{B[i,j-1]+KM1, B[i-1,j] + KM2, B[i-1,k]+ SA[i,u]+KM3} + A[i,j]. V i


i

=1..M

=1..(N-1)

=(j+1)..M

j+1..k

KM1 l lng hng khuyn mi nu Abs(A[i,j]-A[i,j-1]) l con s may mn.


KM2 l lng hng khuyn mi nu Abs(A[i,j]-A[i-1,j]) l con s may mn.
KM3 l tng s lng hng khuyn mi nu Abs(A[i,k]-A[i-1,k]) vAbs(A[i,t]A[i,t+1])

vi

j..(u-1)

cc

con

may

mn.

B[i,N]= Max{B[i,N-1]+KM1,B[i-1,N]+KM2}+A[i,N]
Vi i =1..M
KM1 l lng hng khuyn mi nu abs(A[i,N]-A[i,N-1]) l con s may
mn.
KM2 l lng hng khuyn mi nu abs(A[i,N]-A[i-1,N]) l con s may mn.

Nhn xt:
Cn rt nhiu bi ton khc c dng nh mt trong cc bi ton c bn
ny nhng chung quy li chng ta u c th a n v mt dng chung. Sau
da vo nhng nguyn tc gii chung, ta u c th gii quyt d dng.
Cc dng bi ton tng qut ny khi d liu cho qu gii hn khai bo bng hai
chiu u c th gii quyt bng cch quy hoch lin tc trn 2mng mt
chiu. Sau mi bc quy hoch phi thay i 2 mng ny saocho ph hp vi
bc quy hoch tip theo. Ci kh ca bi ton c d liu ln ny l vic lu
tr trng thi sau khi quy hoch ton b ta cn c th in ra file kt qu qu
trnh i ca phng n ti u.

87

Chng IV. Mt

s t gii

Bi 22: Chia thnh nhiu nhm c tng bng nhau


Cho n s a1, a2,..., an (n ' NI*). Tm cch chia s trn thnh m nhm sao cho
mi nhm u c tng bng nhau v m tm c l ln nht.
D liu vo: c vo t file vn bn MNHOM.INP c cu trc nh sau :
Dng u ghi s n nguyn dng (N <= 10 4)
Cc dng tip theo ghi n s a1, a2,..., an , cc s cch nhau t nht 1 du
cch;
Kt qu ra: Ghi ra file vn bn: MNHOM.OUT c cu trc nh sau:
Dng u tin ghi s m ln nht tm c
M dng tip theo, mi dng ghi cc ch s ca cc phn t thuc cng 1
nhm;
V d:
MNHOM.INP

MNHOM.OUT

8 2 1 3 9 10 11

1 4
2 5
3 6
7

Bi 23: Bi ton xoay DOMINO


Cho N thanh DOMINO xp theo chiu dc nh hnh v.

V d hnh trn gm 5 thanh DOMINO.

88

Mi thanh DOMINO gm 2 phn, phn trn v phn di. Trn mi phn


c mt s t 1 n 6. Yu cu t ra l hy tm cch xoay cc thanh (xoay 180
) sau khi xoay chnh lch gia tng trn v tng di l t nht. Gii hn:
N<=1000.
D liu vo: c t file vn bn DOMINO.INP c cu trc nh sau:
- Dng u tin ghi s nguyn dng N
- N dng tip theo, mi dng i ghi 2 s nguyn ai, bi (1 <=ai,bi <= 6)
tng ng l s trn, di ca thanh DOMINO th i;
Kt qu ra: Ghi ra file vn bn DOMINO.OUT c cu trc nh sau:
- Dng u tin ghi gi tr chnh lch gia tng trn v tng i;
- Cc dng tip theo l ch s ca cc thanh DOMINO c xoay;
V d:
DOMINO.INP

DOMINO.OUT

1 2

1 6
3 5
2 6
6 4

Bi 24: Bi ton ngn hng tr tin;


Mt ngi i ly tin mt ngn hng. Anh ta cn ly mt khon ng M
ng. Ngn hng c N ng tin A1, A2,.., AN. Hi ngn hng c bao nhiu cch
tr tin.
D liu vo: c t file vn bn "MONEY.INP" c dng:
Dng u l hai s N v M (N <=100, M <= 10000)
Cc dng tip theo l cc phn t ca mng A.
89

Kt qu ra: Ghi ra file vn bn "MONEY.OUT" gm mt dng duy nht l


s cch tr tin (S cch tr tin < Maxlongint)
V d:

Bi 25: Bi ton dy c tng chia ht cho k ( thi ton Quc)


Cho mt dy s nguyn A 1, A2,.., AN v mt s k. Hy tm mt dy con
(khng nht thit phi lin tip nhau) di nht c tng cc s chia ht cho s k.
D liu vo: c t file vn bn "dayso.inp" c dng:
Dng 1 gm 2 s N v k (N<=1000; k<=50)
Cc dng tip theo cha cc s ca mng A.
Kt qu ra: Ghi ra file vn bn "dayso.out" gm mt dng ghi s phn t
ln nht tm c.
V d:

Bi 26: Xp vt vo ba l (mi loi vt c lng khng hn


ch);
Mt chic ba l c th cha c mt khi lng khng qu W. C N loi
vt c nh s t 1 n N, mi vt loi i c khi Ai v gi tr s dng Ci
(i=1, 2, , N), s lng vt mi loi l khng hn ch. Hy chn cc vt
(mi loi bao nhiu ci) xp vo ba l sao cho tng gi tr cc vt trong
ba l l ln nht (nu c th xp c).
D liu vo: c t file vn bn BALO.INP c cu trc nh sau:
Dng u ghi 2 s nguyn dng N, W (0 < N, W < 100).
Dng i+1, 1 < i < N) ghi 2 s nguyn dng Ai v Ci (0<Ai, Ci<256)
90

Kt qu ra: Ghi ra file vn bn BALO.OUT c cu trc nh sau:


Dng u ghi tng gi tr ln nht tm c.
T dng th 2, mi dng ghi 2 s l: s hiu loi vt c chn v s
lng loi vt .
V d:
BALO.INP

BALO.OUT

9 100

965

60 7

5 10

8 45

9 3

50 15
9 7
7 68
130 57
1 3
70 123
10 95

Bi 27: i tin
t nc Omega ngi ta ch tiu tin xu. C N loi tin xu, loi th i
c mnh gi l a i ng. Mt ngi khch du lch n Omega du lch vi s tin
M ng. ng ta mun i s tin ra tin xu Omega tin tiu dng. ng ta
cng mun s ng tin i c l t nht (cho ti tin nng khi i y i
). Bn hy gip ng ta tm cch i tin.
D liu: vo trong file vn bn Money.inp c dng:
-

Dng u l 2 s N v M (N <=100 v M <=10000)

- Cc dng tip theo l N s tng ng l cc mnh gi a1, a2, ,an


(vi 0 < ai <= 1000)
91

Kt qu: Ghi ra file vn bn Money.out gm mt dng duy nht l s


ng tin t nht c th i c (S ng xu < Maxlongint)
V d:
Money.inp

Money.out

4 10

1 2 3 4
Money.inp

Money.out

5 10

2 4 6 8 9

Bi 28:Chia tp
Xt tp cha cc s nguyn t 1 ti N vi N = 4K 1 hoc N = 4K. Tp cc
s nguyn ny c th chia thnh hai tp con c tng cc phn t bng nhau. V
d, vi N = 7, ta c 4 cch chia tho mn iu kin trn:
{2,3,4,5} v {1,6,7}
{1,3,4,6} v {2,5,7}
{1,2,5,6} v {3,4,7}
{1,2,4,7} v {3,5,6}
Vi N cho trc, hy tnh s cch chia thnh 2 tp con c tng cc phn
t bng nhau.
D liu: Vo t file vn bn SET.INP, mi dng cha mt s nguyn N (N
<= 100);
Kt qu: a ra file vn bn SET.OUT s cch chia, mi dng ng vi 1
dng ca file d liu vo
V d:
SET.INP

SET.OUT

4
92

11

35

Bi 29: i tin xu
Nc Silverland s dng h thng tin xu, trong cc xu c mnh gi l
mt s chnh phng: 1,4,9,,289(=17 2). Vi h thng ny, tr 10 xu ta c
4 cch:
Tr 10 ng 1 xu,
Tr 1 ng 4 xu v 6 ng 1 xu,
Tr 2 ng 4 xu v 2 ng 1 xu,
Tr 1 ng 9 xu v 1 ng 1 xu.
Nhim v ca bn l xc nh xem c bao nhiu cch tr mt s tin cho
trc nc Silverland.
D liu vo: Vo t file vn bn COIN.INP
Gm nhiu dng, mi dng mt s nguyn dng khng vt qu 800.
Kt qu ra: a ra file vn bn COIN.OUT l s cch tr ng vi tng
trng hp.
V d:
COIN.INP
2
10
30

COIN.OUT
1
4
27

27

27

2793

MC LC
I.1. T tng ca phng php quy hoch ng.........................................................................3
I.1.1. Thut ton chia tr ......................................................................................................3
I.1.2. H thc truy hi ..............................................................................................................4
I.1.3. Lp trnh ng l g?.......................................................................................................5
I.1.4. Phng php quy hoch ng ........................................................................................ 7
I.2. Cc bc thc hin gii bi ton bng phng php quy hoch ng .................................8
I.2.1. Cc bc c bn: ............................................................................................................8
I.2.2. T chc ci t: ..............................................................................................................9
I.2.3 Khi no dng phng php quy ho ch ng? .................................................................9
Bi 1: Tm dy con khng gi m nhiu phn t nht; ............................................................. 10
Hng dn: ......................................................................................................................... 10
* Chng trnh ci t:.......................................................................................................11
Bi 2: Dy con chung di nh t;.............................................................................................. 13
V d: ..................................................................................................................................14
*Hng dn: ....................................................................................................................... 14
*Chng trnh ci t:........................................................................................................15
Bi 3: Dy con c tng bng S .............................................................................................. 17
Bi 4: Xp vt vo ba l (mi vt ch c 1) .................................................................20
*Hng dn ........................................................................................................................ 21
*Chng trnh ci t:........................................................................................................22
Chng III: Bi tp chn lc .....................................................................................................26
Bi 5: B tr phng hp; ........................................................................................................26
* Hng dn: ...................................................................................................................... 27
* Chng trnh ci t:.......................................................................................................27
Bi 6: Cho thu my tnh; ......................................................................................................30
*Hng dn: ....................................................................................................................... 31
* Chng trnh ci t:.......................................................................................................31
Bi 7: Ni im ...................................................................................................................... 34
*Hng dn: ....................................................................................................................... 35
* Chng trnh ci t:.......................................................................................................35
Bi 8: Dy con i chiu, i du di nht;...........................................................................38
* Hng dn: ...................................................................................................................... 39
* Chng trnh ci t:.......................................................................................................39
Bi 9: S php bin i t nht ............................................................................................... 43
* Hng dn: ...................................................................................................................... 43
*Chng trnh ci t:........................................................................................................44
Bi 10: Xu i xng; ...........................................................................................................47
*Hng dn: ....................................................................................................................... 47
*Chng trnh ci t:........................................................................................................47
Bi 11: Bi ton chia ko .......................................................................................................50
94

*Hng dn: ....................................................................................................................... 50


* Chng trnh ci t:.......................................................................................................50
Bi 12: Mua c theo lng (Olympic Balkan 2000) ; ............................................................ 54
* Hng dn: ...................................................................................................................... 55
* Chng trnh ci t:.......................................................................................................55
Bi 13: in du hi vo biu thc ....................................................................................... 57
*Hng dn: ....................................................................................................................... 57
* Chng trnh ci t:.......................................................................................................58
Bi 14: Chia thnh hai nhm c tch l n nht (ACM 10690) ................................................61
*Hng dn: ....................................................................................................................... 62
*Chng trnh ci t:........................................................................................................62
Bi 15: Bi ton mua bn hng .............................................................................................. 64
* Chng trnh ci t:.......................................................................................................65
Bi 16: Lch thu nhn cng ..................................................................................................70
* Hng dn:...................................................................................................................... 71
Bi 17: Ct hnh ch nht ......................................................................................................72
*Hng dn:....................................................................................................................... 73
*Chng trnh ci t:........................................................................................................74
Bi 18: Tr chi vi bng s: Rate This ................................................................................77
*Chng trnh ci t:........................................................................................................78
Bi 19: Con kin ....................................................................................................................82
*Hng dn: ....................................................................................................................... 83
Bi 20: Sa mc ....................................................................................................................... 83
*Hng dn: ....................................................................................................................... 84
Bi 21: Quy bn hng...........................................................................................................85
*Hng dn:....................................................................................................................... 86
Nhn xt: ................................................................................................................................ 87
Bi 22: Chia thnh nhiu nhm c tng bng nhau ............................................................... 88
Bi 23: Bi ton xoay DOMINO ........................................................................................... 88
Bi 24: Bi ton ngn hng tr tin; ...................................................................................... 89
Bi 25: Bi ton dy c tng chia ht cho k ( thi to n Quc) ............................................90
Bi 26: Xp vt vo ba l (mi loi vt c lng khng hn ch); ............................. 90
Bi 27: i tin ...................................................................................................................... 91
Bi 28:Chia tp ...................................................................................................................... 92
Bi 29: i tin xu .................................................................................................................93

95

Ti liu tham kho


1. Trn Hng, Chuyn bi dng HSG Tin hc THPT,NXB GD 2007
2. Nguyn Qu Khang, Bi tp Pascal, NXB QGHN 2002
3. Nguyn Xun My, Mt s vn chn lc trong mn Tin hc, NXB GD
2002
4. Nguyn Xun My, Bi tp lp trnh Pascal, NXB TK 1997
5. Bo TH&NT 1999 - 2006
6. Trang web: http://www.wikipedia.org
7. Trang web: http://www.vnoi.info
8. Trang web: http://www.ddth.com

96

You might also like