Bài tập ôn tập môn Kỹ thuật lập trình có lời giải | Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh

Bài tập ôn tập môn Kỹ thuật lập trình có lời giải của Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!

 

lOMoARcPSD|36991220
CHƯƠNG 1: KIỂU D LIU CÓ CU TRÚC NHP XUT D LIU TRÊN TP TIN
Ghi chú: Bài 1 ến 20 là bt buc.
1. Cho mt lp hc gm n học sinh (n≤50). Thông tin của mt học sinh ược ịnh nghĩa
theo kiu d liu ca hc sinh HOCSINH gm:
Mã s hc sinh (MSHS): chui có ti a 5 ký t.
H tên (hoten): chui có ti a 30 ký t.
Ngày tháng năm sinh (ngaysinh): kiểu DATE.
Địa ch (diachi): chui có ti a 50 ký t.
Gii tính (phai): chui có ti a 3 ký t.
Đim trung bình (diemtb): s thc.
Hãy viết chương trình nhp xut danh sách hc sinh sau ó ếm xem bao
nhiêu học sinh ược lên lớp (Điều kiện ược lên lp là iểm trung bình ≥ 5.0).
ng dn:
- Trước hết ta phi xây dng hàm nhp và xut cho 1 hc sinh.
- Xây dng hàm nhp và xuất ngày tháng năm (Kiểu d liu DATE).
- Sau ó mi xây dng hàm nhp và xut cho danh sách hc sinh.
2. Cho mt mng các phân s (PHANSO) gm n phn t (n≤50). Hãy viết chương
trình nhp xut danh sách các phân s sau ó tìm phân s giá tr ln nht,
tng và tích các phân s và nghch o giá tr các phân s trong mng.
ng dn:
- Trước hết ta phi xây dng hàm nhp và xut cho 1 phân s.
- Xây dng hàm tính tng, hiệu, tích, thương, rút gọn, so sánh và nghch
o cho 2 phân s.
- Sau ó mi xây dng hàm nhp, xut, tính tng, tích cho mng các phân
s.
3. Viết chương trình nhp vào 2 struct THOIGIAN (gm gi, phút, giây). Kim tra
thi gian nhp vào hp l không, nếu hp l thì xut ra khong cách gia 2
mc thi gian trên.
4. Viết chương trình nhập vào 2 struct DATE (gm ngày, tháng, năm), kiểm tra ngày
nhp vào có hp l hay không, nếu có thì xut ra khong cách gia 2 ngày.
lOMoARcPSD|36991220
5. Viết chương trình khai báo kiểu d liu th hin mt s phc. S dng kiu này
viết hàm tính tng, hiu, tích ca hai s phc.
6. Viết chương trình khai báo kiu d liu biu din mt phân s. Hãy viết hàm
thc hin nhng công vic sau:
a) Tính tng, hiệu, tích, thương hai phân số.
b) Rút gn phân s.
c) Qui ng hai phân s.
d) So sánh hai phân s.
7. Viết chương trình khai báo kiểu d liu biu din mt hn s. Hãy viết hàm
thc hin nhng công vic sau :
a) Đổi hn s sang phân s
b) Tính tng, tích hai hn s
8. Viết chương trình khai báo kiểu d liu biu din mt im trong h ta 0xy .
Hãy viết hàm thc hin các công vic sau:
a) Tìm nhng im i xng ca nó qua tung , hoành , to tâm.
b) Tính khong cách gia hai im.
9. Viết chương trình tạo mt mng các s phc. Hãy viết hàm tính tng, tích các s
phc có trong mng.
10. Viết chương trình to mt mng các phân s. Hãy viết hàm thc hin các công
vic sau :
a) Tính tng tt c các phân s (kết qu i dng phân s ti gin)
b) Tìm phân s ln nht, phân s nh nht.
c) Sp xếp mảng tăng dần.
11. T chc d liu qun lí sinh viên bng cu trúc mu tin trong mt mng N phn
t, mi phn t có cu trúc như sau:
- Mã sinh viên.
- Tên.
- Năm sinh.
- Đim toán, lý, hoá, im trung bình. Viết chương trình thực hin
nhng công vic sau:
lOMoARcPSD|36991220
a) Nhp danh sách các sinh viên cho mt lp hc.
b) Xut danh sách sinh viên ra màn hình.
c) Tìm sinh viên có im trung bình cao nht.
d) Sp xếp danh sách lp theo th t tăng dần ca im trung bình.
e) Sp xếp danh sách lp theo th t gim dn ca im toán.
f) Tìm kiếm và in ra các sinh viên có im trung bình lớn hơn 5 và không có
môn nào dưới 3.
g) Tìm sinh viên có tui ln nht.
h) Nhp vào tên ca mt sinh viên. Tìm và in ra các thông tin liên quan ến
sinh viên ó (nếu có).
12. T chc d liu qun lí danh mc các b phim VIDEO, các thông tin liên quan ến
b phim này như sau:
- Tên phim (ta phim).
- Th loi (3 loi : hình s, tình cm, hài).
- Tên o din.
- Tên in viên nam chính.
- Tên din viên n chính.
- Năm sản xut.
- Hãng sn xut
Viết chương trình thực hin nhng công vic sau :
a) Nhp vào b phim mi cùng vi các thông tin liên quan ến b phim này.
b) Nhp mt th loi: In ra danh sách các b phim thuc th loi này.
c) Nhp mt tên nam din viên. In ra các b phim có din viên này óng.
d) Nhp tên o din. In ra danh sách các b phim do o din này dàn dng.
13. Một thư viện cn qun thông tin v các u sách. Mi u sách bao gm các
thông tin sau : MaSSach (mã s sách), TenSach (tên sách), TacGia (tác gi), SL (s
lượng các cun sách ca u sách). Viết chương trình thực hin các chức năng
sau:
a) Nhp vào mt danh sách các u sách (ti a là 100 u sách)
lOMoARcPSD|36991220
b) Nhp vào tên ca quyn sách. In ra thông tin y v các sách tên ó,
nếu không có thì tên ca quyn sách ó thì báo là: Không Tìm Thy
c) Tính tng s sách có trong thư viện.
14. Viết chương trình tạo mt mng danh sách các máy tính ca mt ca hàng, thông
tin ca mt máy tính bao gm :
- Loi máy
- Nơi sản xut
- Thi gian bo hành
a) Viết hàm nhp mt dãy các loại máy tính có thông tin như trên.
b) Hãy viết hàm thng kê xem có bao nhiêu máy có thi gian bo hành là
1 năm.
c) In ra danh sách các máy tính có xut x t M.
15. Để lp ráp mt máy vi tính hoàn chnh cn phi có ti thiu 10 linh kin loi A và
th lp b sung thêm vào khong ti a 8 linh kin loi B. Ti mt ca hàng vi
tính cn qun bán hàng các loi linh kin ti ca hàng. Thông tin v mt loi
linh kin gm có: n linh kin, quy cách, loại, ơn giá loại 1 (chất lượng tt s
nguyên), ơn giá loại 2 (chất lượng thường s nguyên). Viết chương trình thực
hin nhng công vic sau :
a) Nhp vào thông tin v các linh kin có ca hàng.
b) Xut danh sách các linh kin ã nhp theo th t tăng dần ca loi linh
kin và tên linh kin.
c) Cho biết ã có 10 linh kin loi A cn thiết lắp ráp máy hay chưa?
16. Mt ca hàng cn qun lý các mt hàng, thông tin mt mt hàng bao gm:
- Mã hàng.
- Tên mt hàng.
- S lượng.
- Đơn giá.
- S lượng tn.
- Thi gian bảo hành (tính theo ơn vị tháng).
Hãy nhp vào mt danh sách các mt hàng.
lOMoARcPSD|36991220
a) Tìm mt hàng có s lượng tn nhiu nht.
b) Tìm mt hàng có s lượng tn ít nht.
c) Tìm mt hàng có giá tin cao nht.
d) In ra nhng mt hàng có thi gian bo hành lớn hơn 12 tháng.
e) Sp xếp các mt hàng theo th t tăng dần ca s lượng tn.
17. Viết chương trình to tp tin nh phân cha 10000 s nguyên bt k ghi vào file
SONGUYEN.INP, mi dòng 10 s. Sau ó viết chương trình c file SONGUYEN.INP,
sp xếp theo th t tăng dần và lưu kết qu vào file SONGUYEN.OUT.
18. Viết chương trình to mt file cha 10000 s nguyên ngu nhiên ôi mt khác
nhau trong phm vi t 1 ến 32767 và ặt tên là “SONGUYEN.INP”.
19. Viết chương trình tạo mt file cha các s nguyên có tên SONGUYEN.INP. Sau ó
c file SONGUYEN.INP ghi các s chn vào file SOCHAN.OUT nhng s l
vào file SOLE.OUT.
20. Viết chương trình ghi vào tp tin SOCHAN.DAT các s nguyên chn t 0 ến 100.
Viết chương trình ọc tp tin SOCHAN.DAT và xut ra màn hình, mi dòng 30 s.
lOMoARcPSD|36991220
CHƯƠNG 2: KỸ THUT T CHC VÀ X LÝ D LIU TRÊN
MNG 1 CHIU, 2 CHIU
Ghi chú: Bài 1 ến 12 là bt buc, bài 13 tr i là khuyến khích.
Trình nhp môn
1. Tìm mt s trong mt mng bng lính canh.
2. Tìm mt s trong mt mng ã có th t (tìm nh phân).
3. Viết các th tc thêm, xóa, sa, tìm kiếm mt phn t trong mt mng.
4. Viết hàm chuyn mt mng hai chiu thành mt mng mt chiu.
5. Viết hàm chuyn mt mng mt chiu có MxN phn t sang mt mng 2 chiu kích
thưc MxN.
6. Thc hin ghép 2 mng mt chiu A, B to mng C theo nguyên tc tng phn t
ca mng A xen k tng phn t ca mng B.
7. Thc hin xóa b khong trng tha và viết hoa u t mt chui ký t cho trước.
8. Cho ma trận A kích thước MxN (0<M,N<100) cha các s thc nh hơn 100000. Một
im X
i,j
ược gi là im li nếu như nó lớn hơn cả 4 iểm trên, dưới, trái, phi ca nó.
Yêu cu: Tìm X
min
là im li có giá tr nh nht ca mng.
D liệu vào: Được nhp t bàn phím có cấu trúc như sau:
+ Dòng u tiên là hai s nguyên dương M, N biểu diễn kích thước ca ma trn A
(M dòng, N ct).
+ M dòng tiếp theo, mi dòng là N s thc (mi s cách nhau ít nht mt khong
trng) lần lượt là N phn t ca từng dòng tương ứng ca ma trn.
D liu ra: Xut ra màn hình mt dòng duy nht gm 2 s nguyên I, J lần lượt
ch s dòng và ct ca X
min
u tiên t trên xung và t trái qua phi. Nếu không
có im li nào thì xut ra là -1.
Ví d:
D liu vào D liu ra
3 4 1 2
3 9 5 6
4 6 8 7
lOMoARcPSD|36991220
8 11 7 10
9. Nhp vào mt s dng thp phân, chuyn sang dng nh phân, bát phân, thp lc
phân.
10. Nhp vào d, m, y, kim tra (d,m,y) có lp thành một ngày tháng năm hay không, nếu
có xut ra ngày tiếp theo.
K thut lp trình
11. Tính tng, hiu 2 s nguyên ln.
ng dn:
- S dng kiu d liu chui (mng ký t) cho tng s nguyên.
- Làm bài tính tổng trước, làm ược mi tính hiu, x từng trường hp 2 s
dài bng nhau, dài khác nhau…
12. Lp ma trn giá tr bãi mìn cho trò chơi Minesweeper.
13. Cho các s 1, 2, 3, 4, 5 tng S ban u bằng 0. 2 người chơi lần lượt chn mt
trong các s ã cho theo nguyên tc không ược s người kia va chọn trước ó,
mi ln ai chn u cng dn vào tng S.
Ví d: Ban ầu người A chn 2 vy S=0+2=2.
Tiếp theo người B ch ược chn 1, 3, 4, 5 (không ược chn 2), d chn 4, vy
S=2+4=6.
Tiếp theo A ch ược chọn 1, 2, 3, 5 ( ược chn lại 2 nhưng không ược chn 4),
d chn 5. Vy S=6+5=11.
Tiếp theo B ch ược chọn 1, 2, 3, 4 (không ược chn 5 vì A mi va chn 5), ví d
chn 2. Vậy S=11+2=13….
Ai làm cho tng S lớn hơn 35 thua. Lập trình cho người chơi với máy sao cho kh
năng thắng ca máy là cao nht.
ng dn: Trò chơi ược gii quyết bằng phương pháp Lập bảng phương án.
14. Viết chương trình in ra các số nguyên t 1 ến N
2
theo hình xon c với N ược nhp
vào t bàn phím. Ví d, vi N=4 ta có:
1
2
3
4
12
13
14
5
lOMoARcPSD|36991220
11
16
15
6
10
9
8
7
15. (Ma trn k o Ma phương) Viết chương trình nhập vào s t nhiên N (N l), sau ó
in các s t 1 ến n
2
vào trong mt bng vuông sao cho tng các hàng ngang, hàng
dọc và 2 ường chéo u bng nhau.
ng dn: Mt trong nhiu cách giải là như bên dưới
16. (Bài toán dn si). Cho k và n là 2 s nguyên dương, có 2
k
viên sỏi, ược phân b trong
n ống. Người ta cn san s (theo quy tắc dưới ây) lượng si t các ng dn si tr
v mt ng. Quy tc san sỏi như sau: mỗi ln san áp dng cho hai ng si, gi s
rng mt ng a viên si còn ng kia b viên si (không gim tng quát, gi
thiết a, b) thì cho phép san (thay i s lượng t hai ống) như sau: ng a viên ( ng
có s si không thua ng còn li) s là a - b viên, còn ng b tr thành 2*b viên.
Hãy tìm cách san si cui cùng còn 1 ng si vi 2
k
viên.
17. (Bài toán bc si t hai ng si). Cho 2 ng si, mt ng có a viên si, còn óng kia
b viên si (a, b > 0). Hai u th lần lượt chơi trò bốc si, mỗi lượt i mỗi người ược
quyn bc theo quy tc:
- Ít nht phi bốc ược 1 viên
- Hoc bc một lượng si bt k t mt ng, hoc bc cùng một lượng sỏi như
nhau hai ng (nếu ã bc si hai ng).
Đấu th ến lượt i mà không còn si bốc thì coi như thua cuộc.
Tìm chiến lược i người trước thng
lOMoARcPSD|36991220
18.Cho n là s t nhiên. Cho trước mt dãy gm n ô liên tiếp nhau, mi ô hoặc ược ánh
du hoặc không ược ánh du và ch mt trong hai trng thái nói trên mà thôi. Mt
trò chơi hai ấu th ược mô t như sau:
Đầu tiên, toàn b n ô chưa bị ánh du,
Hai u th luân phiên nhau ánh du vào các ô trong dãy theo quy tc:
o Hoc ch ánh du vào mt ô, hoc ánh du vào hai ô liên tiếp nhau
chưa bị ánh du.
o Người ến lượt i mà không còn ô chưa ánh dấu là b thua.
ng dn:
Trng thái kết thúc: mi ô ã b ánh du,
Tp trng thái thua: Các min (miền ược hiểu theo nghĩa (1) gồm dãy liên tc
các ô chưa ánh dấu, (2) ô bt k, nếu có, phi b ánh dấu trước) th ghép
thành các cp ging ht nhau:
o S miền 1 ô chưa ánh du là chn; s miền 2 ô chưa ánh du
chn.
o Chiến lược i người u tiên thng:
Tại bước i u tiên: nếu n l ánh du vào ô có th t (n div 2)+1”
nếu n chn ánh du hai ô (n div 2) và (n div 2)+1.
(Sau ó i th i trước một bước),
Mi bước tiếp theo s chn một “bước i i xứng” với bước
i th vừa i "Đối xng" ây qua trc i xng ca dãy.
Ví d, vi n = 9 nếu i th xoá i ô 3 thì ta xóa ô 7, nếu i th xóa i 2 ô 1 và 2 thì
ta xóa 2 ô 8 và 9 v.v. Vi n=10, nếu i th xóa ô 3 thì ta xoá ô 8, nếu i th xóa hai ô 1
và 2 thì ta xoá 2 ô 9 và 10 v.v..
Sau mỗi bước i ca ta, trình trng ca dãy tính i xng và vì vy, hoc i th gp
trng thái kết thúc, hoc ta luôn còn nước i.
Chú ý:
Có th ặt ra bài toán khó hơn: Từ mt trng thái bt k (mt s ô ã b ánh du, còn
các ô còn lại thì chưa), hãy tìm chiến lược i kh năng người i trước thng cao nht
lOMoARcPSD|36991220
có th ược. Tương t lý gii của trường hp trên, chiến lược i là úng ịnh hướng ti vic
to ra các tình hung i th vào trng thái thua có th ược; nếu không ưa về “gn trng
thái thua hơn” không i th buc ta vào trng thái thua. Mt s ý tưởng liên quan
ến vn này:
- S dng khái niệm ”miền” trước ây. Hai miền khác nhau ưc gi i cp
vi nhau nếu chúng cùng s lượng ô.
- Sau khi ã ghép ược các cp, còn mt s miền chưa ược ghép cp: hãy kh
s min theo kiu này song chú ý ch nên to iu kin cho i th buộc ta rơi vào
trng thái thua.
19. Cho m, n là hai s t nhiên. Cho trước mt bng hai chiu gm m dòng, mi dòng có
n ct các ô, mỗi ô ược ánh du hoặc không ược ánh du ch mt ttrong hai trng
thái nói trên mà thôi. Một trò chơi hai ấu th ược mô t như sau:
Đầu tiên toàn b m x n ô ca bng chưa bị ánh du.
Hai u th luân phiên nhau ánh du các ô trong dãy theo quy tc sau: o Ch
ánh dấu vào các ô chưa bị ánh du.
o Đánh dấu t 1 ô ến 4 ô chưa bị ánh du có k cn nh (hay cnh) và nm
trn trong mt hình vuông có cnh dài không quá 2.
Người ến lượt i mà không còn ô chưa bị ánh du i tiếp là b thua.
Tìm chiến lược i người i trước luôn thng.
ng dn:
Hoàn toàn có th s dng thut toán i i xng ca bài trên gii bài này. Có th
m rộng bài toán như ã làm ở bài toán 3 song vic qun lý các miền khó khăn hơn rt
nhiu.
20.Lp ma trn k ảo theo cách khác bài 15 theo như hướng dẫn bên dưới.
ng dn:
Ví d: Vi N=3 và N=5 ta có
Bc
2
7
6
lOMoARcPSD|36991220
3 16 9 22 15
20 8 21 14 2
Tây 7 25 13 1 19
Đông
24 12 5
18 6
11 4 17 10 23
Nam
- Xut phát t ô bên phi ca ô nm giữa. Đi theo hướng ông bc in các s 1, 2, ...
- Khi in s, cn chú ý mt s nguyên tc sau:
Nếu vượt ra phía ngoài bên phi ca bng tquay tr li ct u
tiên.
Nếu vượt ra phía ngoài bên trên ca bng thì quay tr li dòng cui
cùng.
Nếu s ã in k chia hết cho N thì s tiếp theo s ược viết trên cùng
mt hàng với k nhưng cách 1 ô về phía bên phi.
9
5
1
4
3
8
lOMoARcPSD|36991220
CHƯƠNG 3: TINH CHỈNH CHƯƠNG TRÌNH
Ghi chú: Bài 1 ến 12 là bt buc, bài 13 tr i là khuyến khích.
Trình nhp môn
1. Nhp x và p, tính x
p
.
2. Tính S(n) = 1 + (1+2) + (1+2+3)+…+(1+2+3+…+n) (n<10
6
)
1 1 1
3. Tính S n( ) 1
1 2 1 2 3 1 2 3 ... n
4. Tính S(n) = 1 + (1x2) + (1x2x3)+…+(1x2x3x…xn)
5. Tính S n( ) 1
1
1
1
2! 3! n!
x
1
x x 2
xn với x và n cho trước
6. Tính e
1! 2! n!
7. Tính giá tr phn t th n ca dãy Fibonacci (không dùng mng). 8. Nhp s thc A
(0<A<4), tìm n nh nht tha
1 ...
1
A
n
9. Nhp vào mt mng các s nguyên.
a/ Xếp li mng ó theo th t gim dn.
b/ Nhp vào mt s nguyên t bàn phím. Chèn s ó vào mng sao cho mng
vn có th t gim dần. (không ược xếp li mng)
10. (Phân loi ký t) Cho mt chui ký t, hãy phân loi mi t theo 4 kiu sau: kiu
ch thưng, kiu ch hoa, ch s kiểu “khác” (tức các t không thuc ba
loi trên).
K thut lp trình
11. Viết chương trình thực hin phép nhân 2 s nguyên ln (t 50-100 ch s)
lOMoARcPSD|36991220
12. Tính S(n) = 1 + (1+2) + (1+2+3)+…+(1+2+3+…+n) (n<10
10
)
13. Viết chương trình sp xếp tăng một mng n phn t ch gm các s 1,2 3 sao
cho thc hin ít phép hoán v nht.
14.Tính S = A
0
+ A
1
x + A
2
x
2
+ … + A
n
x
n
ng dn: Chương trình dưới ây dùng 2n phép tính nhân
S = A[0];
xi=1;
for (int i=1; i<=N;i++)
{
xi = xi*x;
S = S + A[i]*xi;
}
Liu có cách viết nào tốt hơn (chạy nhanh hơn) không?
15. Biết giai tha ca n, kí hiệu: n! = 1 x 2 x 3 x … x n. Cho một s nguyên dương n.
Hãy cho biết giai tha ca n có bao nhiêu ch s ‘0’ ở bên phi.
Ví d: 5! = 1 x 2 x 3 x 4 x 5 = 120 có 1 ch s ‘0’ ở bên phi.
16. Cho mt chui S ch gm các ký t < > chiu dài n (n<=1000). Yêu cu: Hãy chèn
n+1 s nguyên dương vào sao cho ta bt ng thc úng sao cho s nguyên ln
nht Tmax trong n+1 s này là nh nht. Viết chương trình nhập vào chui S và xut
ra Tmax như trên. dụ: S = ><>< s cho ra bt ng thức úng như sau: 2>1<2>1<2.
Vy Tmax=2.
17. (Dãy các s 1) Cho mt s nguyên n bt k (0≤n≤10000), n không chia hết cho 2
không chia hết cho 5. Hi ít nht bao nhiêu ch s trong dãy các s 1 sao cho (dãy)
s ó chia hết cho n.
18. Viết chương trình nhập vào mt s nguyên n, xut ra mt s nguyên x >0 nh nht
sao cho p=
i
x
0
11 10x
i
, vi p=nxb và b là mt s nguyên dương.
Ví d: n=3 => x=3, n=7 => x=6, n=9901 => x=12
19. Tính S n( ) (1
1
2
)(1
1
2
)...(1
1
2
)
1 2 n
lOMoARcPSD|36991220
BUỔI 4: PHƯƠNG PHÁP DUYỆT
Ghi chú: Bài 1 ến 18 là bt buc, bài 19 tr i là khuyến khích.
Trình nhp môn
1. Tìm giá tr nh nht ca các phn t trong mt mng mt chiu.
2. Tính tng các phn t trong mng mt chiu.
3. Tính n!
4. Viết chương trình tìm nhị phân (viết quy)
k
5. Tính Cn
6. Tính giá tr phn t th n ca dãy Fibonacci (không dùng mng)
7. Tính tng giá tr các s nguyên có trong mt chui ký t.
Ví d: Chui 2AS34ASDF342B có tng là 2+34+342=378
8. Tìm s nguyên t nh nht trong mng.
9. Tìm UCLN ca tt c các phn t trong mng.
10. Tìm phn t có tn s xut hin nhiu nht trong mt mng.
K thut lp trình
11. Lit kê tt c các dãy nh phân có dài n.
12. Lit kê tt c tp con ca tp n phn t
13. Lit kê tt c hoán v ca tp n phn t
14. Cài t bài mã i tun
15. Cài t bài Tháp Hà Ni.
16. N thành phố, ược ánh s t 0 ến N-1. Một người du lch xut phát t mt thành
ph muốn i thăm các thành ph khác, mi thành ph úng mt ln ri quay v nơi
xut phát. Chi phí i t thành ph i ến thành ph j A[i][j], (0 ≤ i,j < N). Hãy tìm mt
hành trình cho người du lch tng chi phí theo hành trình này là ít nht.
17. Có N chi tiết ược ánh s t 0 ến N-1 cần ược gia công. Các chi tiết có th hoàn thành
trên mt máy A hoc trên mt máy B. Các máy này có th hot ng c lp và làm vic
ng thi. Biết rng thi gian gia công chi tiết i trên máy A là A[i] trên máy B là B[i].
lOMoARcPSD|36991220
Hãy tìm mt phương án phân công cho các máy thi gian hoàn thành c N chi tiết
là sm nht.
18.Mt dãy du ngoc hp l là mt dãy ký t “(“ và “)” ược ịnh nghĩa như sau:
- Dãy rng là 1 dãy du ngoc hp l sâu là 0.
- Nếu A là dãy du ngoc sâu k thì (A) là dãy du ngoc hp l sâu k + 1
- Nếu A và B là hai dãy du ngoc hp l vi sâu lần lượt là p và q thì AB là dãy
du ngoc hp l sâu là max (p,q)
- Độ dài ca 1 dãy ngoc là tng s ký t “(“ và “)”.
Hãy lit kê tt c các dãy du ngoc hp l dài m và sâu n.
D liu vào
D liu ra
8 3
((()()))
((())())
((()))()
(()(()))
()((()))
Gi ý: Mt dãy du ngoc hp l là mt dãy ký t “(“ và “)” thoả c hai iu kin sau: - S
du ngoc m và du ngoc óng bng nhau.
- Duyt t trái sang phi, s du ngoc m luôn lớn hơn hay bằng s du ngoc
óng mi v trí trong chui.
19. Cài t bài toán 8 con hu.
20. Cài t bài hình vuông Latinh (là hình vuông có dòng u và ct u gm các s t 1 ến
n. Trên mi dòng và mi ct u là mt hoán v ca các phn t t 1 ến n.
CHƯƠNG 5: GIẢI THUT SINH
Ghi chú: Bài 1 ến 15 là bt buc, bài 16 tr i là khuyến khích.
Trình nhp môn
1. Đổi tt c các s thp phân t 1 ến n sang h nh phân.
lOMoARcPSD|36991220
2. Viết hàm tính tng các phn t s Amstrong (là s c iểm như sau: số k
s, tổng các lũy thừa bc k ca các ký s bng chính s ó). Ví d: 153 là s các ký
s 1
3
+5
3
+3
3
=153
3. Viết chương trình tìm số l nh nhất nhưng lớn hơn mọi s chn trong mng.
4. Viết hàm thc hin các thao tác trên bit (bt, tt, ly giá tr bit th i ca biến n).
5. Viết bitcount ếm s lượng bit 1 ca mt s nguyên dương n.
6. Cho hàm F(n) với n nguyên không âm ược xác ịnh như sau:
F(0)=0, F(1)=1, F(2n)=F(n), F(2n+1) = F(n) + F(n+1).
Viết chương trình tính F(n).
7. Viết chương trình xut ra tt c các s nguyên t nh hơn n theo thut toán sàng
Eratosthène.
8. Viết chương trình kiểm tra mt chui có i xng không?
9. Viết chương trình nhập vào ma trn A[M][N], hãy xut ra màn hình các phn t A[i][j]
sao cho A[i][j] là phn t có giá tr ln nht dòng i và nh nht ct j.
K thut lp trình
10. Sinh tt c các dãy nh phân dài n.
11. Sinh tt c tp con ca tp n phn t.
12. Sinh tt c hoán v ca tp n phn t.
13. Viết chương trình sinh tất c t hp chp k ca n phn t cho trước.
14. Cho hàm F(n) với n nguyên không âm ược xác ịnh như sau:
F(0)=0, F(1)=1, F(2n)=F(n), F(2n+1) = F(n) + F(n+1).
Viết chương trình tính F(n) với iu kin không dùng mng dài N.
15. Hãy lit kê tt c các dãy nh phân dài n mà trong ó cm ch s “01” xuất hin úng
2 ln.
16. Chú lùn Hugo ang b lc vào mt cung hình ch nht gm M dòng N ct, M,
N≤100. Các dòng (cột) ánh s t 1 ến M (t 1 ến N) t trên xung (t trái sang). Hugo
ang ng ô (X,Y). T mt ô bt k, trong mỗi bước di chuyn, Hugo có th di chuyn
ến 1 trong 8 ô chung quanh. Mi ô ca mê cung ng vi mt s trong phm vi 0 ến
lOMoARcPSD|36991220
255 với ý nghĩa quy nh những hướng Hugo th di chuyn t ô ó. Quy ịnh ó n
sau:
Gi s biu din vi 8 bit ca s ti ô Hugo ang ng (ghi ch H) là b
0
b
1
b
2
b
3
b
4
b
5
b
6
b
7
,
ta ánh s các ô chung quanh ô ó vi các s 7..0, vi 0≤I≤7, Hugo di chuyển theo
ng I nếu và ch nếu bit b
i
=1.
Yêu cu: Hãy ch cho Hugo mt hành trình qua ít ô nht th thoát khi mê cung
nếu có th. Chú ý rng Hugo có th di chuyn ra một ô biên nhưng từ ô biên ó Hugo
không i ra ngoài mê cung ược.
D liu: Vào t file HUGO.INP trong ó dòng th nht ghi 2 s M, N, tiếp theo M
dòng, dòng th I ghi N s tương ng vi các ô dòng th I ca cung. Dòng cui
cùng ghi 2 s X,Y.
Kết quả: Ghi ra file HUGO.OUT như sau: dòng th nht ghi s nguyên không âm C
C=0 nếu Hugo không ra khi cung ược, nếu C>0, ó chính s ô trên hành
trình Hugo i ra khi mê cung. Nếu C>0, trong C dòng tiếp theo, mi dòng ghi ch s
dòng ch s ct ca mt ô lần lượt trên hành trình ca Hugo bt u t ô (X,Y)
cui cùng là ô trên biên mà t ô ó Hugo có th ra khi mê cung.
Ví d:
HUGO.OUT
3
3 4
4 4
5 4
17. Viết chương trình sinh tất c chnh hp chp k ca n phn t cho trước.
18. In ra theo th t tăng dần tt c các phân s ti gin 0<m/n<1 vi mu s ≤10
19. Lit tt c các cách phân tích s nguyên dương n thành tng các s nguyên dương,
hai cách phân tích là hoán v ca nhau ch tính là mt cách.
BUI 6: QUY HOẠCH ĐNG Ghi chú: Bài 1 ến 12 là bt buc, bài
13 tr i là khuyến khích.
lOMoARcPSD|36991220
Trình nhp môn
1. Đổi tt c các s thp phân t 1 ến n sang h nh phân.
k
n! vi 0 k n 20.
2. Tính C
n
k n k!(
)!
3. Viết chương trình xuất ra n phn t u tiên ca dãy Fibonacii
4. Viết hàm xóa các phn t trùng nhau trong dãy, ch gi li mt phn t trong ó.
d: 1 2 3 2 1 2 4 -> 1 2 3 4
5. Viết chương trình tính tích của 2 ma trn
6. Viết chương trình ếm và lit kê các mảng con tăng dần trong mng mt chiu các s
nguyên.
Ví dụ: 6 5 3 2 3 4 2 7 các dãy con tăng dn là 2 3 4 và 2 7
7. Viết chương trình tìm mảng con tăng dần có tng ln nht trong mng mt chiu.
8. Viết chương trình in ra tam giác Pascal
9. Viết chương trình ếm s ln xut hin ca tng loi ký t trong mt chui.
10. Viết chương trình ảo ngược các t trong mt chui, mi t ược ịnh nghĩa cách
nhau ít nht mt ký t trng. Ví d:
“TU DO HANH PHUC” -> “UT OD HNAH CUHP”
K thut lp trình
11. (Bài toán tìm dãy con ơn iệu dài nht). Cho N s nguyên dương, dãy a
1
, a
2
,…a
n
gm
các s thc. Tìm trong dãy ó mt dãy con a
i1
, a
i2
,…a
ik
ca dãy trên thoã mãn iu
kin:
i) aij ≤ aij+1
ii) ij ≤ ij+1 iii) Không có dãy con nào tho tính cht i) & ii), mà có nhiu phn
t hơn.
ng dn:
Đặt A
0
=
-∞ và A
n+1
=
∞.
lOMoARcPSD|36991220
Gi L[i] là dài dãy con tăng dài nhất ca các phn t ly trong min t
A
i
ến A
n+1
và phn t u của dãy tăng là A
i
. Ta có công thức QHĐ ể tính L[i] như
sau:
+ L[n+1] = 1
+ L[i] = max(L[j]) + 1 vi mi i<j<n+1 và A
i
≤ A
j
12. (Xâu con chung dài nhất) Cho hai xâu văn bn X Y dài nm trong khong t
50 ến 100. Sâu Z ược gọi “xâu con chung“ của X và Y nếu Z nhận ược t X (hoc
Y) bng cách loi b mt s t nào ó. Ví d nếu X=”AdksHKoiGAdksHKoiG”
Y=”ADKSHKOIGADKSHKOIG” thì
Z=”AHK” một con xâu chung ca X Y. Hãy tìm xâu con chung ln nht th
ược (trong ví d trên Z cc i s là “AHKGAHKG”) ng dn:
Gi L[i][j] là dài xâu con chung dài nht ca xâu X[i] gm i kí t phn u ca
X và xâu Y[j] gm j kí t phn u ca Y.
Ta có công thức QHĐ như sau:
+ L[0][j]=L[i][0]=0
+ L[i][j]=L[i-1][j-1] + 1 nếu X[i]=Y[j]
+ L[i][j]=max(L[i-1][j], L[i][j-1]) nếu X[i]<>Y[j] k
13. Tính các phn t ca mng C[n][k] = Cn = s t hp chp k ca n phn t, vi 0
k n 20.
o n k k-1 k
Biết Cn = Cn = 1 Cn = Cn-1 + Cn-1
ng dn:
Tính nghim của bài toán trong trường hợp riêng ơn giản nht.
for (i=1;i<=n;i++)
{
C[0][i] = 1;
C[i][i] = 1;
}
lOMoARcPSD|36991220
Tìm các công thc quy biu din nghim tối ưu của bài toán ln thông qua
nghim tối ưu của các bài toán con.
for (i=2;i<=n,i++) for (j=1;i<i,j++)
C[i][j] = C[i-1][j-1] + C[i-1][j];
C[n][k]
0
1
2
3
4
5
1
1
1
2
1
2
1
3
1
3
3
1
4
1
4
6
4
1
5
1
5
10
10
5
1
Có th ci tiến: dùng 2 mng mt chiu thay cho 1 mng hai chiu.
14. Cho n món hàng (n 50). Món th i khối lượng A[i] (s nguyên). Cn chn nhng
món hàng nào b vào mt ba sao tng khối lượng ca các món hàng ã chn
ln nhất nhưng không vượt quá khối lượng W cho trước. (W 100). Mi món ch
chn 1 hoc không chn.
Input:
n W
A[1] A[2] … A[n] Ví d:
4 10
5 2 4 3
OutPut:
Tng khối lượng ca các món hàng b vào ba lô.
Khối lượng ca các món hàng ã chn.
Trong ví d trên:
Tng khối lượng ca các món hàng b vào ba lô là 10
Khối lượng các món hàng ược chn: 5 2 3 ng dn:
T chc d liu:
Fx[k][v] tng khối lượng ca các món hàng b vào ba khi có k món hàng u
tiên chn và khối lượng ti a ca ba lô là v.
Vi k [1, n], v [1, W].
lOMoARcPSD|36991220
Nói cách khác: Khi k món chn, Fx[k][v] khối lượng tối ưu khi khối lượng
ti a ca ba lô là v.
Khối lượng tối ưu luôn nhỏ hơn hoặc bng khối lượng ti a: Fx[k][v] v
dụ: Fx[4][10] = 8, nghĩa trong trưng hp tối ưu, tổng khối lượng ca các
món hàng ược chn là 8, khi có 4 món u tiên chn (tn th 1 ến món th 4) và
khối lượng ti a ca ba lô là 10. Không nht thiết c 4 món ều ược chn.
Gii thut to bng:
* Trường hợp ơn giản ch có 1 món chn: Ta tính Fx[1][v] vi mi v:
Nếu th chn (nghĩa khối lượng ti a ca ba >= khối lượng ca các món
hàng th 1), thì chn: Fx[1][v] = A[1];
Ngược li ( v < A[1] ), không th chọn, nghĩa là Fx[1][v] = 0;
* Gi s ta ã tính ược Fx[k1][v] ến dòng k1, vi mi v [1, W]. Khi có
thêm món th k chn, ta cn tính Fx[k][v] dòng k, vi mi v [1,W] Nếu có th
chn món hàng th k (v >= A[k]), thì có 2 trường hp:
Trường hp 1: Nếu chn thêm món th k b vào ba lô, thì
Fx[k][v] = Fx[k1][u] + A[k];
Vi u là khối lượng còn li sau khi chn món th k. u = v A[k]
Trường hợp 2: Ngược li, không chn món th k, thì
Fx[k][v] = Fx[k1][v];
Trong 2 trường hp trên ta chọn trường hp nào có Fx[k][v] lớn hơn. Ngược
li (v < A[k]), thì không th chọn, nghĩa là Fx[k][v] = Fx[k–1][v]; Tóm li: công
thc quy là:
if (v >= A[k])
Fx[k][v] = Max(Fx[k-1][v - A[k]] + A[k] , Fx[k-1][v])
else
Fx[k][v] := Fx[k-1][v];
i ây là bảng Fx[k][v] tính ược trong ví d trên:
[k][v]
1
2
3
4
5
6
7
8
9
10
1
0
0
0
0
5
5
5
5
5
5
2
0
2
2
2
5
5
7
7
7
7
lOMoARcPSD|36991220
3
0
2
2
4
5
6
7
7
9
9
4
0
2
3
4
5
6
7
8
9
10
Gii thut tra bng tìm các món hàng ược chn:
Chú ý: Nếu Fx[k][v] = Fx[k1][v] thì món th k không ược chn.
Fx[n][W] là tng khối lượng tối ưu của các món hàng b vào ba lô.
c 1: Bt u t k = n, v = W.
c 2: Tìm trong cột v, ngược t i lên, ta tìm dòng k sao cho
Fx[k][v] > Fx[k1][v].
Đánh dấu món th k ược chn: Chn[k] = true;
c 3: v = Fx[k][v] A[k].
Nếu v > 0 thì thc hiện bước 2, ngược li thc hiện bước 4 Bước 4: Da
vào mng, chn in ra các món hàng ược chn.
15. (Bài toán chia ko) Cho n gói ko (n 50). Gói th i có A[i] viên ko. Cn chia các gói
ko này cho 2 em bé sao cho tng s viên ko mi em nhận ược chênh lch ít nht.
Mi em nhn nguyên gói. Không m gói ko ra chia li. Hãy lit s ko trong các
gói ko mi em nhận ược.
Input:
n
A[1] A[2] … A[n]
Output: S ko trong các gói ko mi em nhận ược, tng s ko mi
em nhận ược.
ng dn:
Gi S là tng s vin ko S = A[1] + A[2] + … + A[n];
S2 là na tng s ko: S2 = S/2; (chia nguyên)
Cho em th nht chọn trước nhng gói ko sao cho tng s viên ko
mà em nhận ược là ln nhất nhưng không vượt quá s ko S2.
Gói ko nào em bé th nht không chn thì em bé th hai chn.
Bài toán ược ưa về bài ba lô 1.
lOMoARcPSD|36991220
16. (Bài toán balô 2) Cho n món hàng (n 50). Món th i khối lượng A[i] và giá tr
C[i] (s nguyên). Cn chn nhng món hàng nào b vào mt ba lô sao tng giá tr
ca các món hàng ã chn là ln nhất nhưng tổng khối lượng của chúng không vượt
quá khối lượng W cho trước (W 100).
Mi món ch chn 1 hoc không chn.
Input:
n W A[1]
C[1]
A[2] C[2]
A[n] C[n]
Ví d:
5 13
3 4
4 5
5 6
2 3
1 1 Output:
Tng giá tr ca các món hàng b vào ba lô.
Khối lượng và giá tr ca các món hàng ã chn.
Trong ví d trên:
Tng giá tr ca các món hàng b vào ba : 16
Các n ược chn: 1(3, 4) 2(4, 5) 3(5, 6) 5(1, 1) ng dn:
Tương tự bài ba lô 1, nhưng Fx[k][v] là giá trị ln nht ca ba lô khi có k món
hàng u tiên chn và khối lượng ti a ca ba lô là v.
Công thc quy là:
if (v >= A[k])
Fx[k][v] = Max(Fx[k-1][v-A[k]] + C[k], Fx[k-1][v]) else
Fx[k][v]:=Fx[k1][v];
Chú ý: ch khác bài balô 1 ch dùng C[k] thay cho A[k] Dưới ây
là bảng Fx[k][v] tính ược trong ví d trên:
[k][v]
1
2
3
4
5
6
7
8
9
10
11
12
13
1
0
0
4
4
4
4
4
4
4
4
4
4
4
lOMoARcPSD|36991220
2
0
0
4
5
5
5
9
9
9
9
9
9
9
3
0
0
4
5
6
6
9
10
11
11
11
15
15
4
0
3
4
5
7
8
9
10
12
13
14
15
15
5
1
3
4
5
7
8
9
10
12
13
14
15
16
17. (Bài toán balô 3) Cho n loi hàng (n 50). Mi món hàng thuc loi th i khi
lượng A[i] giá tr C[i] (s nguyên). S lượng các món hàng ca mi loi không
hn chế. Cn chn nhng món hàng ca nhng loi hàng nào b vào mt ba lô sao
tng giá tr ca các món hàng ã chn ln nhất nhưng tổng khối lượng ca chúng
không vượt quá khi lượng W cho trước (W 100). Mi loi hàng th hoc không
chn món nào, hoc chn 1 món, hoc chn nhiu món.
Input: n W A[1] C[1]
A[2] C[2]
A[n] C[n]
d:
5 13
3 4
4 5
5 6
2 3
1 1 OutPut:
Tng giá tr ca các món hàng b vào ba lô.
S lượng ca các loi hàng ã chn.
Trong ví d trên:
Tng giá tr ca các món hàng b vào ba lô: 19
Các món ược chn:
Chn 1 món hàng loi 1, mi món có khối lượng là 3 và giá tr là 4 Chn 5
món hàng loi 4, mi món có khối lượng là 2 và giá tr là 3
ng dn:
T chc d liu:
lOMoARcPSD|36991220
Fx[k][v] tng giá tr ca các món hàng b vào ba khi k loi hàng u tiên
chn và khối lượng ti a ca ba lô là v, vi k [1, n], v [1, W]. X[k][v] là s lượng
các món hàng loại k ược chn khi khối lượng ti a ca ba lô là v.
Gii thut to bng:
* Trường hợp ơn giản ch có 1 món chn: Ta tính Fx[1][v] vi mi v:
X[1][v] = v/A[1]; (chia nguyên)
Fx[1][v] = X[1][v] * C[1]
* Gi s ta ã tính ược Fx[k1][v] ến dòng k1, vi mi v [1, W]. Khi có thêm loi
th k chn, ta cn tính Fx[k][v] dòng k, vi mi v [1,W] Nếu ta chn xk món
hàng loi k, thì khối lượng còn li ca ba dành cho các loi hàng t loi 1 ến
loi k 1 là: u = v xk * A[k] Khi ó giá tr ca ba lô là: Fx[k][v]= Fx[k1][u] + xk
* C[k]
Vi xk thay i t 0 ến yk, ta chn giá tr ln nhất lưu vào Fx[k][v]. Trong ó yk =
v/A[k] (chia nguyên) s lượng ln nht các món hàng loi k có th ược chn b
vào ba lô, khi khối lượng ti a ca ba lô là v.
Tóm li: công thc quy là:
Fx[k][v] = Max(Fx[k-1][v xk * A[k]] + xk * C[k])
Max xét vi xk thay i t 0 ến v/A[k] (chia nguyên), và v xk * A[k] > 0
i ây là bảng Fx[k][v] và X[k][v] tính ược trong ví d trên. Bng màu xám là
X[k][v]:
[k][v]
1
2
3
4
5
6
7
8
9
10
11
12
13
1
0
0
0
0
4
1
4
1
4
1
8
2
8
2
8
2
12
3
12
3
12
3
16
4
16
4
2
0
0
0
0
4
0
4
0
5
1
8
0
9
1
9
1
12
0
13
1
14
2
16
0
17
1
3
0
0
0
0
4
0
4
0
5
0
8
0
9
0
10
1
12
0
13
0
14
0
16
0
17
0
4
0
0
0
0
4
0
4
0
7
1
8
0
10
2
11
1
13
3
14
2
16
4
17
3
19
5
5
0
0
1
1
4
0
5
1
7
0
8
0
10
0
11
0
13
0
14
0
16
0
17
0
19
0
18. (Bài toán i tin): Cho n loi t giy bc. T giy bc th i có mnh giá A[i]. S t mi
loi không gii hn. Cn chi tr cho khách hàng s tin M ng. Hãy cho biết mi loi
tin cn bao nhiêu t sao cho tng s t là ít nht. Nếu không ổi ược, thì thông báo
“KHONG DOI DUOC”. N < 50; A[i] < 256; M < 10000
Input: n M
lOMoARcPSD|36991220
A[1] A[2] … A[n]
Ví du: 3 18
3 10 12
Output: Tng s t phi tr.
S t mi loi.
ng dn: (Cách 1, tương t bài ba lô 3)
Gi Fx[i][j] là s t ít nhất ược dùng tr s tin j ng khi có i loi tin t loi
1 ến loi i. Vi i = 1 .. n; j = 1 .. M.
X[i][j] là s t giy bc loi th i ược dùng chi tr s tin j ồng. * Trường
hợp ơn giản ch có 1 loi tin chn: Ta tính Fx[1][j] vi mi j
j div A[1] nếu j mod A[1] = 0
Fx[1][ j] =
nếu j mod A[1] 0 (không ổi ược)
* Gi s ta ã tính ược Fx[i1][j] ến dòng i1, vi mi j [1, M]. Khi thêm loi
tin th i chn, ta cn tính Fx[i][j] dòng i, vi mi j [1, M]
Nếu ta chn k t loi i, thì s tin còn li dành cho các loi tin khác t loi 1 ến
loi i 1 là: u = j k * A[k]
Khi ó tng s t là: Fx[i][j]= Fx[i1][u] + k
Vi k thay i t 0 ến kMax, ta chn giá tr nh nhất lưu vào Fx[i][j]. Trong ó kMax
= j div A[k] là s t nhiu nht ca loi tin i i s tin j.
Tóm li: công thc quy là:
Fx[i,j] = Min(Fx[i-1, j k * A[i]] + k)
Min xét vi k thay i t 0 ến j div A[i], và j k * A[i] > 0
ng dn: (Cách 2)
Gi Fx[i] là s t ít nhất ược dùng i s tin i. Vi i = 1 .. M.
Với quy ước Fx[i] = (hoc 0) khi không ổi ược.
X[i] là loi tin cuối cùng ược dùng i s tin i. (ch lưu 1 loại tin) Gii thut
to bng:
Xếp mệnh giá A[i] tăng dần.
{
lOMoARcPSD|36991220
Khi gán Fx[i] = , X[i] = 0 vi mi j = 1 .. M
Gán Fx[0] = 0
Vi s tin i chy t 1 ến M, ta tính Fx[i] và X[i], bng cách:
Nếu chn loi tin j thì s tin còn li là i A[j]
Fx[i] = Min( Fx[i A[j]] + 1) nếu i >= A[j] Min xét
vi loi tin j chy t 1 ến n.
X[i] = j ng vi giá tr min ca Fx[i]
i ây mảng Fx[i] X[i] tính ưc trong d trên (dùng 3 loi tin 3 ng, 10
ng, 12 ng i s tin 18 ng)
i
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Fx[i]
1
2
3
1
1
2
2
3
3
X[i]
0
0
0
1
0
0
1
0
0
1
2
0
3
2
0
3
2
0
3
19. (Phân công - Đề thi tuyển sinh sau Đại học khoá 1997 Đại hc Tng hp TP
HCM) Mt cơ s phn mềm có n phòng máy vi tính. Cơ sở này phi tuyn chọn m kĩ
sư ể bo trì máy. Sau khi tham gia ý kiến ca các chuyên gia và kinh nghim ca các
ơn vị khác, người ta hiu rng nếu phân công i kĩ sư chuyên bo trì ti phòng máy j
thì s máy hng hằng năm phải thanh lí là a[i,j]. Do hn chế v thi gian và iu kin
i li ch có th phân công mỗi kĩ sư bảo trì ti mt phòng máy.
Bng ví d i ây với m = 5 (kĩ sư) và n = 3 (phòng máy).
S kĩ sư
phòng máy 1
phòng máy 2
phòng máy 3
0
14
25
20
1
10
19
14
2
7
16
11
3
4
14
8
4
1
12
6
5
0
11
5
Yêu cầu: Tìm ra phương án phân công mỗi phòng máy phân bao nhiêu kĩ sư sao
cho tng s máy phi thanh lí hằng năm là ít nhất.
D liu: vào t file văn bản KiSu.inp có 2 dòng:
lOMoARcPSD|36991220
dòng u gm 2 s nguyên dương m, n. (m, n < 50) m+1 dòng tiếp theo
bng a[i][j].
Kết quả: ưa ra file văn bản KiSu.out gm 2 dòng:
Dòng u cha tng s máy (ít nht) phi thanh lí hằng năm.
Dòng thư hai chứa n s nguyên dươngsố kĩ sư ược phân công bo t
mi phòng máy.
Trong ví d trên, phân công 3 kĩ sư cho phòng máy 1, 1 kĩ sư cho phòng máy
2, 1 kĩ sư cho phòng máy 3. Khi ó, hằng năm số máy ít nht phi thanh lý 37
máy.
Ví d:
KiSu.inp ( i vi ví d trên)
KiSu.out
5 3
14 25 20
10 19 14
7 16 11
4 14 8
1 12 6
0 11 5
37
3 1 1
ng dn:
Gi F[i][j] là s máy hư ít nhất hằng năm khi có i kĩ sư ược phân công bo trì j
phòng máy u tiên.
19.1. (Tam phân a giác) Cho mt a giác li n nh. Hãy phân a giác này thành n 2 tam giác
bng n 3 ường chéo, sao cho tng ca dài của các ường chéo này nh nht. Các
ường chéo này không ct nhau (ch có th giao nhau nh ca a giác).
D liu: vào t file văn bản TAMPHAN.INP có n + 1 dòng:
Dòng u cha mt s nguyên n là s nh ca a giác (3 < n < 50).
Mi dòng trong n dòng kế tiếp cha hai s thc hoành tung ca mi
nh ca a giác.
lOMoARcPSD|36991220
Kết quả: ưa ra file văn bản TAMPHAN.OUT, gm dòng u cha mt s thc
(có 4 ch s thp phân) tng nh nht ca dài của các ường chéo. Mi dòng
trong n 3 dòng tiếp theo cha 2 s nguyên ch s ca hai nh ca mỗi ường
chéo ược chn.
Ví d:
TAMPHAN.INP
TAMPHAN.OUT
6
2 1
2 4
6 6
10 6
10 3
7 0
17.4859
2 6
3 6
3 5
ng dn: Gi Fx[i][j] tng dài ngn nht của các ường chéo khi tam
phân a giác có i nh k t nh th j.
20. (Trạm bưu iện) Trên một con ường thng, dài, s nhà ca nhng nhà dc theo mt
bên ường là s o dài tính t ầu con ường (s nguyên). Người ta chn ra k nhà làm
trm bưu iện.
Hãy xác nh s nhà ca k nhà ó sao cho các nhà còn li cách mt trạm bưu iện
nào ó gn nht hay tng khong cách ca các nhà còn li ến mt trạm bưu iện
gn nht nào ó là nh nht.
D liu: vào t file văn bản BuuDien.inp gm 2 dòng:
Dòng u: cha hai s nguyên n k ( n < 300; k < 30), vi n tng s
nhà trên con ường ó, k là s trạm bưu iện.
Dòng th hai là các s nhà theo th t tăng dần.
Kết quả: ưa ra file văn bản BuuDien.out gm 2 dòng:
Dòng u: là k nhà dùng làm trạm bưu iện.
Dòng th hai là tng khong cách ca các nhà còn li ến mt trạm bưu
in gn nht nào ó.
Ví d:
BuuDien.inp
BuuDien.out
lOMoARcPSD|36991220
10 5
1 2 3 6 7 9 11 22 44 50
2 7 22 44 50
9
21. Cho hai dãy s D1và D2 mi dãy t 50 ến 150 s nguyên dương. Dãy số D3 ược
gọi “dãy con chung” củaD1 và D2 nếu D3 nhận ược t D1 (D2) bng cách loi b
mt s >=0 s nào ó. Tìm dãy chung con s ng s nhiu nht. ng dn:
Mt dng khác ca bài toán xâu con chung
| 1/30

Preview text:

lOMoARcPSD| 36991220
CHƯƠNG 1: KIỂU DỮ LIỆU CÓ CẤU TRÚC – NHẬP XUẤT DỮ LIỆU TRÊN TẬP TIN
Ghi chú: Bài 1 ến 20 là bắt buộc. 1.
Cho một lớp học gồm n học sinh (n≤50). Thông tin của một học sinh ược ịnh nghĩa
theo kiểu dữ liệu của học sinh HOCSINH gồm:
• Mã số học sinh (MSHS): chuỗi có tối a 5 ký tự.
• Họ tên (hoten): chuỗi có tối a 30 ký tự.
• Ngày tháng năm sinh (ngaysinh): kiểu DATE.
• Địa chỉ (diachi): chuỗi có tối a 50 ký tự.
• Giới tính (phai): chuỗi có tối a 3 ký tự.
• Điểm trung bình (diemtb): số thực.
Hãy viết chương trình nhập và xuất danh sách học sinh sau ó ếm xem có bao
nhiêu học sinh ược lên lớp (Điều kiện ược lên lớp là iểm trung bình ≥ 5.0). Hướng dẫn: -
Trước hết ta phải xây dựng hàm nhập và xuất cho 1 học sinh. -
Xây dựng hàm nhập và xuất ngày tháng năm (Kiểu dữ liệu DATE). -
Sau ó mới xây dựng hàm nhập và xuất cho danh sách học sinh. 2.
Cho một mảng các phân số (PHANSO) gồm n phần tử (n≤50). Hãy viết chương
trình nhập và xuất danh sách các phân số sau ó tìm phân số có giá trị lớn nhất,
tổng và tích các phân số và nghịch ảo giá trị các phân số trong mảng. Hướng dẫn:
- Trước hết ta phải xây dựng hàm nhập và xuất cho 1 phân số.
- Xây dựng hàm tính tổng, hiệu, tích, thương, rút gọn, so sánh và nghịch ảo cho 2 phân số.
- Sau ó mới xây dựng hàm nhập, xuất, tính tổng, tích cho mảng các phân số. 3.
Viết chương trình nhập vào 2 struct THOIGIAN (gồm giờ, phút, giây). Kiểm tra
thời gian nhập vào có hợp lệ không, nếu hợp lệ thì xuất ra khoảng cách giữa 2 mốc thời gian trên. 4.
Viết chương trình nhập vào 2 struct DATE (gồm ngày, tháng, năm), kiểm tra ngày
nhập vào có hợp lệ hay không, nếu có thì xuất ra khoảng cách giữa 2 ngày. lOMoARcPSD| 36991220 5.
Viết chương trình khai báo kiểu dữ liệu thể hiện một số phức. Sử dụng kiểu này
ể viết hàm tính tổng, hiệu, tích của hai số phức. 6.
Viết chương trình khai báo kiểu dữ liệu ể biểu diễn một phân số. Hãy viết hàm
thực hiện những công việc sau:
a) Tính tổng, hiệu, tích, thương hai phân số. b) Rút gọn phân số. c) Qui ồng hai phân số. d) So sánh hai phân số. 7.
Viết chương trình khai báo kiểu dữ liệu ể biểu diễn một hỗn số. Hãy viết hàm
thực hiện những công việc sau :
a) Đổi hỗn số sang phân số
b) Tính tổng, tích hai hỗn số 8.
Viết chương trình khai báo kiểu dữ liệu ể biểu diễn một iểm trong hệ tọa ộ 0xy .
Hãy viết hàm thực hiện các công việc sau:
a) Tìm những iểm ối xứng của nó qua tung ộ, hoành ộ, toạ ộ tâm.
b) Tính khoảng cách giữa hai iểm. 9.
Viết chương trình tạo một mảng các số phức. Hãy viết hàm tính tổng, tích các số phức có trong mảng. 10.
Viết chương trình tạo một mảng các phân số. Hãy viết hàm thực hiện các công việc sau :
a) Tính tổng tất cả các phân số (kết quả dưới dạng phân số tối giản)
b) Tìm phân số lớn nhất, phân số nhỏ nhất.
c) Sắp xếp mảng tăng dần. 11.
Tổ chức dữ liệu ể quản lí sinh viên bằng cấu trúc mẫu tin trong một mảng N phần
tử, mỗi phần tử có cấu trúc như sau: - Mã sinh viên. - Tên. - Năm sinh. -
Điểm toán, lý, hoá, iểm trung bình. Viết chương trình thực hiện những công việc sau: lOMoARcPSD| 36991220
a) Nhập danh sách các sinh viên cho một lớp học.
b) Xuất danh sách sinh viên ra màn hình.
c) Tìm sinh viên có iểm trung bình cao nhất.
d) Sắp xếp danh sách lớp theo thứ tự tăng dần của iểm trung bình.
e) Sắp xếp danh sách lớp theo thứ tự giảm dần của iểm toán. f)
Tìm kiếm và in ra các sinh viên có iểm trung bình lớn hơn 5 và không có môn nào dưới 3.
g) Tìm sinh viên có tuổi lớn nhất.
h) Nhập vào tên của một sinh viên. Tìm và in ra các thông tin liên quan ến sinh viên ó (nếu có). 12.
Tổ chức dữ liệu quản lí danh mục các bộ phim VIDEO, các thông tin liên quan ến bộ phim này như sau: - Tên phim (tựa phim).
- Thể loại (3 loại : hình sự, tình cảm, hài). - Tên ạo diễn.
- Tên iễn viên nam chính.
- Tên diễn viên nữ chính. - Năm sản xuất. - Hãng sản xuất
Viết chương trình thực hiện những công việc sau :
a) Nhập vào bộ phim mới cùng với các thông tin liên quan ến bộ phim này.
b) Nhập một thể loại: In ra danh sách các bộ phim thuộc thể loại này.
c) Nhập một tên nam diễn viên. In ra các bộ phim có diễn viên này óng.
d) Nhập tên ạo diễn. In ra danh sách các bộ phim do ạo diễn này dàn dựng. 13.
Một thư viện cần quản lý thông tin về các ầu sách. Mỗi ầu sách bao gồm các
thông tin sau : MaSSach (mã số sách), TenSach (tên sách), TacGia (tác giả), SL (số
lượng các cuốn sách của ầu sách). Viết chương trình thực hiện các chức năng sau:
a) Nhập vào một danh sách các ầu sách (tối a là 100 ầu sách) lOMoARcPSD| 36991220
b) Nhập vào tên của quyển sách. In ra thông tin ầy ủ về các sách có tên ó,
nếu không có thì tên của quyển sách ó thì báo là: Không Tìm Thấy
c) Tính tổng số sách có trong thư viện. 14.
Viết chương trình tạo một mảng danh sách các máy tính của một cửa hàng, thông
tin của một máy tính bao gồm : - Loại máy - Nơi sản xuất - Thời gian bảo hành
a) Viết hàm nhập một dãy các loại máy tính có thông tin như trên.
b) Hãy viết hàm thống kê xem có bao nhiêu máy có thời gian bảo hành là 1 năm.
c) In ra danh sách các máy tính có xuất xứ từ Mỹ. 15.
Để lắp ráp một máy vi tính hoàn chỉnh cần phải có tối thiểu 10 linh kiện loại A và
có thể lắp bổ sung thêm vào khoảng tối a 8 linh kiện loại B. Tại một cửa hàng vi
tính cần quản lý bán hàng các loại linh kiện tại cửa hàng. Thông tin về một loại
linh kiện gồm có: Tên linh kiện, quy cách, loại, ơn giá loại 1 (chất lượng tốt – số
nguyên), ơn giá loại 2 (chất lượng thường – số nguyên). Viết chương trình thực
hiện những công việc sau :
a) Nhập vào thông tin về các linh kiện có ở cửa hàng.
b) Xuất danh sách các linh kiện ã nhập theo thứ tự tăng dần của loại linh kiện và tên linh kiện.
c) Cho biết ã có ủ 10 linh kiện loại A cần thiết lắp ráp máy hay chưa? 16.
Một cửa hàng cần quản lý các mặt hàng, thông tin một mặt hàng bao gồm: - Mã hàng. - Tên mặt hàng. - Số lượng. - Đơn giá. - Số lượng tồn.
- Thời gian bảo hành (tính theo ơn vị tháng).
Hãy nhập vào một danh sách các mặt hàng. lOMoARcPSD| 36991220
a) Tìm mặt hàng có số lượng tồn nhiều nhất.
b) Tìm mặt hàng có số lượng tồn ít nhất.
c) Tìm mặt hàng có giá tiền cao nhất.
d) In ra những mặt hàng có thời gian bảo hành lớn hơn 12 tháng.
e) Sắp xếp các mặt hàng theo thứ tự tăng dần của số lượng tồn. 17.
Viết chương trình tạo tập tin nhị phân chứa 10000 số nguyên bất kỳ ghi vào file
SONGUYEN.INP, mỗi dòng 10 số. Sau ó viết chương trình ọc file SONGUYEN.INP,
sắp xếp theo thứ tự tăng dần và lưu kết quả vào file SONGUYEN.OUT. 18.
Viết chương trình tạo một file chứa 10000 số nguyên ngẫu nhiên ôi một khác
nhau trong phạm vi từ 1 ến 32767 và ặt tên là “SONGUYEN.INP”. 19.
Viết chương trình tạo một file chứa các số nguyên có tên SONGUYEN.INP. Sau ó
ọc file SONGUYEN.INP và ghi các số chẵn vào file SOCHAN.OUT và những số lẻ vào file SOLE.OUT. 20.
Viết chương trình ghi vào tập tin SOCHAN.DAT các số nguyên chẵn từ 0 ến 100.
Viết chương trình ọc tập tin SOCHAN.DAT và xuất ra màn hình, mỗi dòng 30 số. lOMoARcPSD| 36991220
CHƯƠNG 2: KỸ THUẬT TỔ CHỨC VÀ XỬ LÝ DỮ LIỆU TRÊN MẢNG 1 CHIỀU, 2 CHIỀU
Ghi chú: Bài 1 ến 12 là bắt buộc, bài 13 trở i là khuyến khích. Trình ộ nhập môn
1. Tìm một số trong một mảng bằng lính canh.
2. Tìm một số trong một mảng ã có thứ tự (tìm nhị phân).
3. Viết các thủ tục thêm, xóa, sửa, tìm kiếm một phần tử trong một mảng.
4. Viết hàm chuyển một mảng hai chiều thành một mảng một chiều.
5. Viết hàm chuyển một mảng một chiều có MxN phần tử sang một mảng 2 chiều kích thước MxN.
6. Thực hiện ghép 2 mảng một chiều A, B ể tạo mảng C theo nguyên tắc từng phần tử
của mảng A xen kẻ từng phần tử của mảng B.
7. Thực hiện xóa bỏ khoảng trắng thừa và viết hoa ầu từ một chuỗi ký tự cho trước.
8. Cho ma trận A kích thước MxN (0iểm Xi,j ược gọi là iểm lồi nếu như nó lớn hơn cả 4 iểm trên, dưới, trái, phải của nó.
Yêu cầu: Tìm Xmin là iểm lồi có giá trị nhỏ nhất của mảng.
Dữ liệu vào: Được nhập từ bàn phím có cấu trúc như sau:
+ Dòng ầu tiên là hai số nguyên dương M, N biểu diễn kích thước của ma trận A (M dòng, N cột).
+ M dòng tiếp theo, mỗi dòng là N số thực (mỗi số cách nhau ít nhất một khoảng
trắng) lần lượt là N phần tử của từng dòng tương ứng của ma trận.
Dữ liệu ra: Xuất ra màn hình một dòng duy nhất gồm 2 số nguyên I, J lần lượt là
chỉ số dòng và cột của Xmin ầu tiên từ trên xuống và từ trái qua phải. Nếu không
có iểm lồi nào thì xuất ra là -1. Ví dụ: Dữ liệu vào Dữ liệu ra 3 4 1 2 3 9 5 6 4 6 8 7 lOMoARcPSD| 36991220 8 11 7 10
9. Nhập vào một số dạng thập phân, chuyển sang dạng nhị phân, bát phân, thập lục phân.
10. Nhập vào d, m, y, kiểm tra (d,m,y) có lập thành một ngày tháng năm hay không, nếu
có xuất ra ngày tiếp theo. Kỹ thuật lập trình
11. Tính tổng, hiệu 2 số nguyên lớn. Hướng dẫn:
- Sử dụng kiểu dữ liệu chuỗi (mảng ký tự) cho từng số nguyên.
- Làm bài tính tổng trước, làm ược mới tính hiệu, xử lý từng trường hợp 2 số
có ộ dài bằng nhau, ộ dài khác nhau…
12. Lập ma trận giá trị bãi mìn cho trò chơi Minesweeper.
13. Cho các số 1, 2, 3, 4, 5 và tổng S ban ầu bằng 0. Có 2 người chơi lần lượt chọn một
trong các số ã cho theo nguyên tắc không ược số mà người kia vừa chọn trước ó,
mỗi lần ai chọn ều cộng dồn vào tổng S.
Ví dụ: Ban ầu người A chọn 2 vậy S=0+2=2.
Tiếp theo người B chỉ ược chọn 1, 3, 4, 5 (không ược chọn 2), ví dụ chọn 4, vậy S=2+4=6.
Tiếp theo A chỉ ược chọn 1, 2, 3, 5 ( ược chọn lại 2 nhưng không ược chọn 4), ví
dụ chọn 5. Vậy S=6+5=11.
Tiếp theo B chỉ ược chọn 1, 2, 3, 4 (không ược chọn 5 vì A mới vừa chọn 5), ví dụ chọn 2. Vậy S=11+2=13….
Ai làm cho tổng S lớn hơn 35 là thua. Lập trình cho người chơi với máy sao cho khả
năng thắng của máy là cao nhất.
Hướng dẫn: Trò chơi ược giải quyết bằng phương pháp Lập bảng phương án.
14. Viết chương trình in ra các số nguyên từ 1 ến N2 theo hình xoắn ốc với N ược nhập
vào từ bàn phím. Ví dụ, với N=4 ta có: 1 2 3 4 12 13 14 5 lOMoARcPSD| 36991220 11 16 15 6 10 9 8 7
15. (Ma trận kỳ ảo – Ma phương) Viết chương trình nhập vào số tự nhiên N (N lẻ), sau ó
iền các số từ 1 ến n2 vào trong một bảng vuông sao cho tổng các hàng ngang, hàng
dọc và 2 ường chéo ều bằng nhau.
Hướng dẫn: Một trong nhiều cách giải là như bên dưới
16. (Bài toán dồn sỏi). Cho k và n là 2 số nguyên dương, có 2k viên sỏi, ược phân bố trong
n ống. Người ta cần san sẻ (theo quy tắc dưới ây) lượng sỏi từ các ống ể dồn sỏi trở
về một ống. Quy tắc san sỏi như sau: mỗi lần san áp dụng cho hai ống sỏi, giả sử
rằng một ống có a viên sỏi và còn ống kia có b viên sỏi (không giảm tổng quát, giả
thiết a, b) thì cho phép san (thay ổi số lượng từ hai ống) như sau: ống a viên ( ống
có số sỏi không thua ống còn lại) sẽ là a - b viên, còn ống b trở thành 2*b viên.
Hãy tìm cách san sỏi ể cuối cùng còn 1 ống sỏi với 2k viên.
17. (Bài toán bốc sỏi từ hai ống sỏi). Cho 2 ống sỏi, một ống có a viên sỏi, còn óng kia có
b viên sỏi (a, b > 0). Hai ấu thủ lần lượt chơi trò bốc sỏi, mỗi lượt i mỗi người ược quyền bốc theo quy tắc:
- Ít nhất phải bốc ược 1 viên
- Hoặc bốc một lượng sỏi bất kỳ từ một ống, hoặc bốc cùng một lượng sỏi như
nhau ở hai ống (nếu ã bốc sỏi ở hai ống).
Đấu thủ ến lượt i mà không còn sỏi ể bốc thì coi như thua cuộc.
Tìm chiến lược i ể người trước thắng lOMoARcPSD| 36991220
18.Cho n là số tự nhiên. Cho trước một dãy gồm n ô liên tiếp nhau, mỗi ô hoặc ược ánh
dấu hoặc không ược ánh dấu và chỉ ở một trong hai trạng thái nói trên mà thôi. Một
trò chơi hai ấu thủ ược mô tả như sau:
• Đầu tiên, toàn bộ n ô chưa bị ánh dấu,
• Hai ấu thủ luân phiên nhau ánh dấu vào các ô trong dãy theo quy tắc:
o Hoặc chỉ ánh dấu vào một ô, hoặc ánh dấu vào hai ô liên tiếp nhau chưa bị ánh dấu.
o Người ến lượt i mà không còn ô chưa ánh dấu là bị thua. Hướng dẫn:
• Trạng thái kết thúc: mọi ô ã bị ánh dấu,
• Tập trạng thái thua: Các miền (miền ược hiểu theo nghĩa (1) gồm dãy liên tục
các ô chưa ánh dấu, (2) ô bất kỳ, nếu có, phải bị ánh dấu trước) có thể ghép
thành các cặp giống hệt nhau:
o Số miền có 1 ô chưa ánh dấu là chẵn; số miền có 2 ô chưa ánh dấu là chẵn.
o Chiến lược i ể người ầu tiên thắng:
Tại bước i ầu tiên: nếu n lẻ ánh dấu vào ô có thứ tự (n div 2)+1”
nếu n chẵn ánh dấu hai ô (n div 2) và (n div 2)+1.
(Sau ó ối thủ i trước một bước),
Mỗi bước tiếp theo sẽ chọn một “bước i ối xứng” với bước mà
ối thủ vừa i "Đối xứng" ở ây qua trục ối xứng của dãy.
Ví dụ, với n = 9 nếu ối thủ xoá i ô 3 thì ta xóa ô 7, nếu ối thủ xóa i 2 ô 1 và 2 thì
ta xóa 2 ô 8 và 9 v.v. Với n=10, nếu ối thủ xóa ô 3 thì ta xoá ô 8, nếu ối thủ xóa hai ô 1
và 2 thì ta xoá 2 ô 9 và 10 v.v..
Sau mỗi bước i của ta, trình trạng của dãy có tính ối xứng và vì vậy, hoặc ối thủ gặp
trạng thái kết thúc, hoặc ta luôn còn nước i. Chú ý:
Có thể ặt ra bài toán khó hơn: Từ một trạng thái bất kỳ (một số ô ã bị ánh dấu, còn
các ô còn lại thì chưa), hãy tìm chiến lược i ể khả năng người i trước thắng là cao nhất lOMoARcPSD| 36991220
có thể ược. Tương tự lý giải của trường hợp trên, chiến lược i là úng ịnh hướng tới việc
tạo ra các tình huống ối thủ vào trạng thái thua có thể ược; nếu không ưa về “gần trạng
thái thua hơn” và không ể ối thủ buộc ta vào trạng thái thua. Một số ý tưởng liên quan ến vấn ề này: -
Sử dụng khái niệm ”miền” trước ây. Hai miền khác nhau ược gọi là i cặp
với nhau nếu chúng cùng số lượng ô. -
Sau khi ã ghép ược các cặp, còn một số miền chưa ược ghép cặp: hãy khử
số miền theo kiểu này song chú ý chớ nên tạo iều kiện cho ối thủ buộc ta rơi vào trạng thái thua.
19. Cho m, n là hai số tự nhiên. Cho trước một bảng hai chiều gồm m dòng, mỗi dòng có
n cột các ô, mỗi ô ược ánh dấu hoặc không ược ánh dấu và chỉ ở một ttrong hai trạng
thái nói trên mà thôi. Một trò chơi hai ấu thủ ược mô tả như sau:
• Đầu tiên toàn bộ m x n ô của bảng chưa bị ánh dấu.
• Hai ấu thủ luân phiên nhau ánh dấu các ô trong dãy theo quy tắc sau: o Chỉ
ánh dấu vào các ô chưa bị ánh dấu.
o Đánh dấu từ 1 ô ến 4 ô chưa bị ánh dấu có kề cận ỉnh (hay cạnh) và nằm
trọn trong một hình vuông có cạnh dài không quá 2.
• Người ến lượt i mà không còn ô chưa bị ánh dấu ể i tiếp là bị thua.
Tìm chiến lược i ể người i trước luôn thắng. Hướng dẫn:
Hoàn toàn có thể sử dụng thuật toán i ối xứng của bài trên ể giải bài này. Có thể
mở rộng bài toán như ã làm ở bài toán 3 song ở việc quản lý các miền khó khăn hơn rất nhiều.
20.Lập ma trận kỳ ảo theo cách khác bài 15 theo như hướng dẫn bên dưới. Hướng dẫn:
Ví dụ: Với N=3 và N=5 ta có Bắc 2 7 6 lOMoARcPSD| 36991220 9 5 1 3 16 9 22 15 4 3 8 20 8 21 14 2 Tây 7 25 13 1 19 Đông 24 12 5 18 6 11 4 17 10 23 Nam
- Xuất phát từ ô bên phải của ô nằm giữa. Đi theo hướng ông bắc ể iền các số 1, 2, ...
- Khi iền số, cần chú ý một số nguyên tắc sau:
Nếu vượt ra phía ngoài bên phải của bảng thì quay trở lại cột ầu tiên.
Nếu vượt ra phía ngoài bên trên của bảng thì quay trở lại dòng cuối cùng.
Nếu số ã iền k chia hết cho N thì số tiếp theo sẽ ược viết trên cùng
một hàng với k nhưng cách 1 ô về phía bên phải. lOMoARcPSD| 36991220
CHƯƠNG 3: TINH CHỈNH CHƯƠNG TRÌNH
Ghi chú: Bài 1 ến 12 là bắt buộc, bài 13 trở i là khuyến khích. Trình ộ nhập môn 1. Nhập x và p, tính xp.
2. Tính S(n) = 1 + (1+2) + (1+2+3)+…+(1+2+3+…+n) (n<106) 1 1 1 3. Tính S n( ) 1 1 2 1 2 3 1 2 3 ... n
4. Tính S(n) = 1 + (1x2) + (1x2x3)+…+(1x2x3x…xn) 5. Tính S n( ) 1 1 1 1 2! 3! n! 1 x x x 2 xn với x và n cho trước 6. Tính e 1! 2! n!
7. Tính giá trị phần tử thứ n của dãy Fibonacci (không dùng mảng). 8. Nhập số thực A (0 1 ... 1 A n
9. Nhập vào một mảng các số nguyên.
a/ Xếp lại mảng ó theo thứ tự giảm dần.
b/ Nhập vào một số nguyên từ bàn phím. Chèn số ó vào mảng sao cho mảng
vẫn có thứ tự giảm dần. (không ược xếp lại mảng)
10. (Phân loại ký tự) Cho một chuỗi ký tự, hãy phân loại mỗi ký tự theo 4 kiểu sau: kiểu
chữ thường, kiểu chữ hoa, chữ số và kiểu “khác” (tức là các ký tự không thuộc ba loại trên). Kỹ thuật lập trình
11. Viết chương trình thực hiện phép nhân 2 số nguyên lớn (từ 50-100 chữ số) lOMoARcPSD| 36991220
12. Tính S(n) = 1 + (1+2) + (1+2+3)+…+(1+2+3+…+n) (n<1010)
13. Viết chương trình sắp xếp tăng một mảng có n phần tử chỉ gồm các số 1,2 và 3 sao
cho thực hiện ít phép hoán vị nhất.
14.Tính S = A0 + A1x + A2x2 + … + Anxn
Hướng dẫn: Chương trình dưới ây dùng 2n phép tính nhân S = A[0]; xi=1; for (int i=1; i<=N;i++) { xi = xi*x; S = S + A[i]*xi; }
Liệu có cách viết nào tốt hơn (chạy nhanh hơn) không?
15. Biết giai thừa của n, kí hiệu: n! = 1 x 2 x 3 x … x n. Cho một số nguyên dương n.
Hãy cho biết giai thừa của n có bao nhiêu chữ số ‘0’ ở bên phải.
Ví dụ: 5! = 1 x 2 x 3 x 4 x 5 = 120 có 1 chữ số ‘0’ ở bên phải.
16. Cho một chuỗi S chỉ gồm các ký tự < và > có chiều dài n (n<=1000). Yêu cầu: Hãy chèn
n+1 số nguyên dương vào sao cho ta có bất ẳng thức úng sao cho số nguyên lớn
nhất Tmax trong n+1 số này là nhỏ nhất. Viết chương trình nhập vào chuỗi S và xuất
ra Tmax như trên. Ví dụ: S = ><>< sẽ cho ra bất ẳng thức úng như sau: 2>1<2>1<2. Vậy Tmax=2.
17. (Dãy các số 1) Cho một số nguyên n bất kỳ (0≤n≤10000), n không chia hết cho 2 và
không chia hết cho 5. Hỏi có ít nhất bao nhiêu chữ số trong dãy các số 1 sao cho (dãy) số ó chia hết cho n.
18. Viết chương trình nhập vào một số nguyên n, xuất ra một số nguyên x >0 nhỏ nhất
sao cho p= ix 011 10x i , với p=nxb và b là một số nguyên dương. Ví dụ: n=3 => x=3, n=7 => x=6, n=9901 => x=12 19. Tính S n( ) (1 12 )(1 12 )...(1 12 ) 1 2 n lOMoARcPSD| 36991220
BUỔI 4: PHƯƠNG PHÁP DUYỆT
Ghi chú: Bài 1 ến 18 là bắt buộc, bài 19 trở i là khuyến khích. Trình ộ nhập môn
1. Tìm giá trị nhỏ nhất của các phần tử trong một mảng một chiều.
2. Tính tổng các phần tử trong mảng một chiều. 3. Tính n!
4. Viết chương trình tìm nhị phân (viết ệ quy) k 5. Tính Cn
6. Tính giá trị phần tử thứ n của dãy Fibonacci (không dùng mảng)
7. Tính tổng giá trị các số nguyên có trong một chuỗi ký tự.
Ví dụ: Chuỗi 2AS34ASDF342B có tổng là 2+34+342=378
8. Tìm số nguyên tố nhỏ nhất trong mảng.
9. Tìm UCLN của tất cả các phần tử trong mảng.
10. Tìm phần tử có tần số xuất hiện nhiều nhất trong một mảng. Kỹ thuật lập trình
11. Liệt kê tất cả các dãy nhị phân có ộ dài n.
12. Liệt kê tất cả tập con của tập n phần tử
13. Liệt kê tất cả hoán vị của tập n phần tử
14. Cài ặt bài mã i tuần
15. Cài ặt bài Tháp Hà Nội.
16. Có N thành phố, ược ánh số từ 0 ến N-1. Một người du lịch xuất phát từ một thành
phố muốn i thăm các thành phố khác, mỗi thành phố úng một lần rồi quay về nơi
xuất phát. Chi phí i từ thành phố i ến thành phố j là A[i][j], (0 ≤ i,j < N). Hãy tìm một
hành trình cho người du lịch ể tổng chi phí theo hành trình này là ít nhất.
17. Có N chi tiết ược ánh số từ 0 ến N-1 cần ược gia công. Các chi tiết có thể hoàn thành
trên một máy A hoặc trên một máy B. Các máy này có thể hoạt ộng ộc lập và làm việc
ồng thời. Biết rằng thời gian gia công chi tiết i trên máy A là A[i] và trên máy B là B[i]. lOMoARcPSD| 36991220
Hãy tìm một phương án phân công cho các máy ể thời gian hoàn thành cả N chi tiết là sớm nhất.
18.Một dãy dấu ngoặc hợp lệ là một dãy ký tự “(“ và “)” ược ịnh nghĩa như sau:
- Dãy rỗng là 1 dãy dấu ngoặc hợp lệ ộ sâu là 0.
- Nếu A là dãy dấu ngoặc ộ sâu k thì (A) là dãy dấu ngoặc hợp lệ ộ sâu k + 1
- Nếu A và B là hai dãy dấu ngoặc hợp lệ với ộ sâu lần lượt là p và q thì AB là dãy
dấu ngoặc hợp lệ ộ sâu là max (p,q)
- Độ dài của 1 dãy ngoặc là tổng số ký tự “(“ và “)”.
Hãy liệt kê tất cả các dãy dấu ngoặc hợp lệ có ộ dài m và ộ sâu n. Dữ liệu vào Dữ liệu ra 8 3 ((()())) ((())()) ((()))() (()(())) ()((()))
Gợi ý: Một dãy dấu ngoặc hợp lệ là một dãy ký tự “(“ và “)” thoả cả hai iều kiện sau: - Số
dấu ngoặc mở và dấu ngoặc óng bằng nhau.
- Duyệt từ trái sang phải, số dấu ngoặc mở luôn lớn hơn hay bằng số dấu ngoặc
óng ở mọi vị trí trong chuỗi.
19. Cài ặt bài toán 8 con hậu.
20. Cài ặt bài hình vuông Latinh (là hình vuông có dòng ầu và cột ầu gồm các số từ 1 ến
n. Trên mỗi dòng và mỗi cột ều là một hoán vị của các phần tử từ 1 ến n.
CHƯƠNG 5: GIẢI THUẬT SINH
Ghi chú: Bài 1 ến 15 là bắt buộc, bài 16 trở i là khuyến khích. Trình ộ nhập môn
1. Đổi tất cả các số thập phân từ 1 ến n sang hệ nhị phân. lOMoARcPSD| 36991220
2. Viết hàm tính tổng các phần tử là số Amstrong (là số có ặc iểm như sau: số có k ký
số, tổng các lũy thừa bậc k của các ký số bằng chính số ó). Ví dụ: 153 là số có các ký số 13+53+33=153
3. Viết chương trình tìm số lẻ nhỏ nhất nhưng lớn hơn mọi số chẵn trong mảng.
4. Viết hàm thực hiện các thao tác trên bit (bật, tắt, lấy giá trị bit thứ i của biến n).
5. Viết bitcount ếm số lượng bit 1 của một số nguyên dương n.
6. Cho hàm F(n) với n nguyên không âm ược xác ịnh như sau:
F(0)=0, F(1)=1, F(2n)=F(n), F(2n+1) = F(n) + F(n+1).
Viết chương trình tính F(n).
7. Viết chương trình xuất ra tất cả các số nguyên tố nhỏ hơn n theo thuật toán sàng Eratosthène.
8. Viết chương trình kiểm tra một chuỗi có ối xứng không?
9. Viết chương trình nhập vào ma trận A[M][N], hãy xuất ra màn hình các phần tử A[i][j]
sao cho A[i][j] là phần tử có giá trị lớn nhất dòng i và nhỏ nhất cột j. Kỹ thuật lập trình
10. Sinh tất cả các dãy nhị phân có ộ dài n.
11. Sinh tất cả tập con của tập n phần tử.
12. Sinh tất cả hoán vị của tập n phần tử.
13. Viết chương trình sinh tất cả tổ hợp chập k của n phần tử cho trước.
14. Cho hàm F(n) với n nguyên không âm ược xác ịnh như sau:
F(0)=0, F(1)=1, F(2n)=F(n), F(2n+1) = F(n) + F(n+1).
Viết chương trình tính F(n) với iều kiện không dùng mảng ộ dài N.
15. Hãy liệt kê tất cả các dãy nhị phân ộ dài n mà trong ó cụm chữ số “01” xuất hiện úng 2 lần.
16. Chú lùn Hugo ang bị lạc vào một mê cung hình chữ nhật gồm M dòng và N cột, M,
N≤100. Các dòng (cột) ánh số từ 1 ến M (từ 1 ến N) từ trên xuống (từ trái sang). Hugo
ang ứng ở ô (X,Y). Từ một ô bất kỳ, trong mỗi bước di chuyển, Hugo có thể di chuyển
ến 1 trong 8 ô chung quanh. Mỗi ô của mê cung ứng với một số trong phạm vi 0 ến lOMoARcPSD| 36991220
255 với ý nghĩa quy ịnh những hướng Hugo có thể di chuyển từ ô ó. Quy ịnh ó như sau:
Giả sử biểu diễn với 8 bit của số tại ô Hugo ang ứng (ghi chữ H) là b0b1b2b3b4b5b6b7,
ta ánh số các ô chung quanh ô ó với các số 7..0, với 0≤I≤7, Hugo di chuyển theo
hướng I nếu và chỉ nếu bit bi=1.
Yêu cầu: Hãy chỉ cho Hugo một hành trình qua ít ô nhất ể có thể thoát khỏi mê cung
nếu có thể. Chú ý rằng Hugo có thể di chuyển ra một ô biên nhưng từ ô biên ó Hugo
không i ra ngoài mê cung ược.
Dữ liệu: Vào từ file HUGO.INP trong ó dòng thứ nhất ghi 2 số M, N, tiếp theo là M
dòng, dòng thứ I ghi N số tương ứng với các ô dòng thứ I của mê cung. Dòng cuối cùng ghi 2 số X,Y.
Kết quả: Ghi ra file HUGO.OUT như sau: dòng thứ nhất ghi số nguyên không âm C
mà C=0 nếu Hugo không ra khỏi mê cung ược, nếu C>0, ó chính là số ô trên hành
trình Hugo i ra khỏi mê cung. Nếu C>0, trong C dòng tiếp theo, mỗi dòng ghi chỉ số
dòng và chỉ số cột của một ô lần lượt trên hành trình của Hugo bắt ầu từ ô (X,Y) và
cuối cùng là ô trên biên mà từ ô ó Hugo có thể ra khỏi mê cung. Ví dụ: HUGO.INP HUGO.OUT 5 6 3 1 2 3 4 5 6 3 4 7 8 9 10 11 12 4 4 13 14 15 16 17 18 5 4 19 20 21 22 23 24 25 26 27 28 29 30 3 4
17. Viết chương trình sinh tất cả chỉnh hợp chập k của n phần tử cho trước.
18. In ra theo thứ tự tăng dần tất cả các phân số tối giản 019. Liệt kê tất cả các cách phân tích số nguyên dương n thành tổng các số nguyên dương,
hai cách phân tích là hoán vị của nhau chỉ tính là một cách.
BUỔI 6: QUY HOẠCH ĐỘNG Ghi chú: Bài 1 ến 12 là bắt buộc, bài
13 trở i là khuyến khích. lOMoARcPSD| 36991220 Trình ộ nhập môn
1. Đổi tất cả các số thập phân từ 1 ến n sang hệ nhị phân. k n! với 0 k n 20. 2. Tính Cn k n k!( )!
3. Viết chương trình xuất ra n phần tử ầu tiên của dãy Fibonacii
4. Viết hàm xóa các phần tử trùng nhau trong dãy, chỉ giữ lại một phần tử trong ó. Ví
dụ: 1 2 3 2 1 2 4 -> 1 2 3 4
5. Viết chương trình tính tích của 2 ma trận
6. Viết chương trình ếm và liệt kê các mảng con tăng dần trong mảng một chiều các số nguyên.
Ví dụ: 6 5 3 2 3 4 2 7 các dãy con tăng dần là 2 3 4 và 2 7
7. Viết chương trình tìm mảng con tăng dần có tổng lớn nhất trong mảng một chiều.
8. Viết chương trình in ra tam giác Pascal
9. Viết chương trình ếm số lần xuất hiện của từng loại ký tự trong một chuỗi.
10. Viết chương trình ảo ngược các từ trong một chuỗi, mỗi từ ược ịnh nghĩa là cách
nhau ít nhất một ký tự trắng. Ví dụ: “TU DO HANH PHUC” -> “UT OD HNAH CUHP” Kỹ thuật lập trình
11. (Bài toán tìm dãy con ơn iệu dài nhất). Cho N số nguyên dương, dãy a1, a2 ,…an gồm
các số thực. Tìm trong dãy ó có một dãy con ai1, ai2,…aik của dãy trên thoã mãn iều kiện: i) aij ≤ aij+1
ii) ij ≤ ij+1 iii) Không có dãy con nào thoả tính chất i) & ii), mà có nhiều phần tử hơn. Hướng dẫn: Đặt A = = 0 -∞ và An+1 ∞. lOMoARcPSD| 36991220
Gọi L[i] là ộ dài dãy con tăng dài nhất của các phần tử lấy trong miền từ
Ai ến An+1 và phần tử ầu của dãy tăng là Ai. Ta có công thức QHĐ ể tính L[i] như sau: + L[n+1] = 1
+ L[i] = max(L[j]) + 1 với mọi i12. (Xâu con chung dài nhất) Cho hai xâu văn bản X và Y só ộ dài nằm trong khoảng từ
50 ến 100. Sâu Z ược gọi là “xâu con chung“ của X và Y nếu Z nhận ược từ X (hoặc
Y) bằng cách loại bỏ một số kí tự nào ó. Ví dụ nếu X=”AdksHKoiGAdksHKoiG” và
Y=”ADKSHKOIGADKSHKOIG” thì
Z=”AHK” là một con xâu chung của X và Y. Hãy tìm xâu con chung lớn nhất có thể
ược (trong ví dụ trên Z cực ại sẽ là “AHKGAHKG”) Hướng dẫn:
Gọi L[i][j] là ộ dài xâu con chung dài nhất của xâu X[i] gồm i kí tự phần ầu của
X và xâu Y[j] gồm j kí tự phần ầu của Y.
Ta có công thức QHĐ như sau: + L[0][j]=L[i][0]=0
+ L[i][j]=L[i-1][j-1] + 1 nếu X[i]=Y[j]
+ L[i][j]=max(L[i-1][j], L[i][j-1]) nếu X[i]<>Y[j] k
13. Tính các phần tử của mảng C[n][k] = Cn = số tổ hợp chập k của n phần tử, với 0 k n 20. o n k k-1 k Biết Cn = Cn = 1 và Cn = Cn-1 + Cn-1 Hướng dẫn:
Tính nghiệm của bài toán trong trường hợp riêng ơn giản nhất. for (i=1;i<=n;i++) { C[0][i] = 1; C[i][i] = 1; } lOMoARcPSD| 36991220
Tìm các công thức ệ quy biểu diễn nghiệm tối ưu của bài toán lớn thông qua
nghiệm tối ưu của các bài toán con. for (i=2;i<=n,i++) for (j=1;i
C[i][j] = C[i-1][j-1] + C[i-1][j]; C[n][k] 0 1 2 3 4 5 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1
Có thể cải tiến: dùng 2 mảng một chiều thay cho 1 mảng hai chiều.
14. Cho n món hàng (n 50). Món thứ i có khối lượng là A[i] (số nguyên). Cần chọn những
món hàng nào ể bỏ vào một ba lô sao tổng khối lượng của các món hàng ã chọn là
lớn nhất nhưng không vượt quá khối lượng W cho trước. (W 100). Mỗi món chỉ
chọn 1 hoặc không chọn. Input: n W A[1] A[2] … A[n] Ví dụ: 4 10 5 2 4 3 OutPut:
Tổng khối lượng của các món hàng bỏ vào ba lô.
Khối lượng của các món hàng ã chọn. Trong ví dụ trên:
Tổng khối lượng của các món hàng bỏ vào ba lô là 10
Khối lượng các món hàng ược chọn: 5 2 3 Hướng dẫn: Tổ chức dữ liệu:
Fx[k][v] là tổng khối lượng của các món hàng bỏ vào ba lô khi có k món hàng ầu
tiên ể chọn và khối lượng tối a của ba lô là v. Với k [1, n], v [1, W]. lOMoARcPSD| 36991220
Nói cách khác: Khi có k món ể chọn, Fx[k][v] là khối lượng tối ưu khi khối lượng tối a của ba lô là v.
Khối lượng tối ưu luôn nhỏ hơn hoặc bằng khối lượng tối a: Fx[k][v] v
Ví dụ: Fx[4][10] = 8, nghĩa là trong trường hợp tối ưu, tổng khối lượng của các
món hàng ược chọn là 8, khi có 4 món ầu tiên ể chọn (từ món thứ 1 ến món thứ 4) và
khối lượng tối a của ba lô là 10. Không nhất thiết cả 4 món ều ược chọn. Giải thuật tạo bảng: *
Trường hợp ơn giản chỉ có 1 món ể chọn: Ta tính Fx[1][v] với mọi v:
Nếu có thể chọn (nghĩa là khối lượng tối a của ba lô >= khối lượng của các món
hàng thứ 1), thì chọn: Fx[1][v] = A[1];
Ngược lại ( v < A[1] ), không thể chọn, nghĩa là Fx[1][v] = 0; *
Giả sử ta ã tính ược Fx[k–1][v] ến dòng k–1, với mọi v [1, W]. Khi có
thêm món thứ k ể chọn, ta cần tính Fx[k][v] ở dòng k, với mọi v [1,W] Nếu có thể
chọn món hàng thứ k (v >= A[k]), thì có 2 trường hợp:
– Trường hợp 1: Nếu chọn thêm món thứ k bỏ vào ba lô, thì Fx[k][v] = Fx[k–1][u] + A[k];
Với u là khối lượng còn lại sau khi chọn món thứ k. u = v – A[k]
– Trường hợp 2: Ngược lại, không chọn món thứ k, thì Fx[k][v] = Fx[k–1][v];
Trong 2 trường hợp trên ta chọn trường hợp nào có Fx[k][v] lớn hơn. Ngược
lại (v < A[k]), thì không thể chọn, nghĩa là Fx[k][v] = Fx[k–1][v]; Tóm lại: công thức ệ quy là: if (v >= A[k])
Fx[k][v] = Max(Fx[k-1][v - A[k]] + A[k] , Fx[k-1][v]) else Fx[k][v] := Fx[k-1][v];
Dưới ây là bảng Fx[k][v] tính ược trong ví dụ trên: [k][v] 1 2 3 4 5 6 7 8 9 10 1 0 0 0 0 5 5 5 5 5 5 2 0 2 2 2 5 5 7 7 7 7 lOMoARcPSD| 36991220 3 0 2 2 4 5 6 7 7 9 9 4 0 2 3 4 5 6 7 8 9 10
Giải thuật tra bảng ể tìm các món hàng ược chọn:
Chú ý: Nếu Fx[k][v] = Fx[k–1][v] thì món thứ k không ược chọn.
Fx[n][W] là tổng khối lượng tối ưu của các món hàng bỏ vào ba lô.
Bước 1: Bắt ầu từ k = n, v = W.
Bước 2: Tìm trong cột v, ngược từ dưới lên, ta tìm dòng k sao cho Fx[k][v] > Fx[k–1][v].
Đánh dấu món thứ k ược chọn: Chọn[k] = true;
Bước 3: v = Fx[k][v] – A[k].
Nếu v > 0 thì thực hiện bước 2, ngược lại thực hiện bước 4 Bước 4: Dựa
vào mảng, chọn ể in ra các món hàng ược chọn.
15. (Bài toán chia kẹo) Cho n gói kẹo (n 50). Gói thứ i có A[i] viên kẹo. Cần chia các gói
kẹo này cho 2 em bé sao cho tổng số viên kẹo mỗi em nhận ược chênh lệch ít nhất.
Mỗi em nhận nguyên gói. Không mở gói kẹo ra ể chia lại. Hãy liệt kê số kẹo trong các
gói kẹo mỗi em nhận ược. Input: n A[1] A[2] … A[n]
Output: Số kẹo trong các gói kẹo mỗi em nhận ược, và tổng số kẹo mỗi em nhận ược. Hướng dẫn:
Gọi S là tổng số viện kẹo S = A[1] + A[2] + … + A[n];
S2 là nửa tổng số kẹo: S2 = S/2; (chia nguyên)
Cho em bé thứ nhất chọn trước những gói kẹo sao cho tổng số viên kẹo
mà em nhận ược là lớn nhất nhưng không vượt quá số kẹo S2.
Gói kẹo nào em bé thứ nhất không chọn thì em bé thứ hai chọn.
Bài toán ược ưa về bài ba lô 1. lOMoARcPSD| 36991220
16. (Bài toán balô 2) Cho n món hàng (n 50). Món thứ i có khối lượng là A[i] và giá trị
C[i] (số nguyên). Cần chọn những món hàng nào ể bỏ vào một ba lô sao tổng giá trị
của các món hàng ã chọn là lớn nhất nhưng tổng khối lượng của chúng không vượt
quá khối lượng W cho trước (W 100).
Mỗi món chỉ chọn 1 hoặc không chọn. Input: n W A[1] C[1] A[2] C[2] … A[n] C[n] Ví dụ: 5 13 3 4 4 5 5 6 2 3 1 1 Output:
Tổng giá trị của các món hàng bỏ vào ba lô.
Khối lượng và giá trị của các món hàng ã chọn. Trong ví dụ trên:
Tổng giá trị của các món hàng bỏ vào ba : 16
Các món ược chọn: 1(3, 4) 2(4, 5) 3(5, 6) 5(1, 1) Hướng dẫn:
Tương tự bài ba lô 1, nhưng Fx[k][v] là giá trị lớn nhất của ba lô khi có k món
hàng ầu tiên ể chọn và khối lượng tối a của ba lô là v. Công thức ệ quy là: if (v >= A[k])
Fx[k][v] = Max(Fx[k-1][v-A[k]] + C[k], Fx[k-1][v]) else Fx[k][v]:=Fx[k–1][v];
Chú ý: chỉ khác bài balô 1 ở chỗ dùng C[k] thay cho A[k] Dưới ây
là bảng Fx[k][v] tính ược trong ví dụ trên: [k][v] 1 2 3 4 5 6 7 8 9 10 11 12 13 1 0 0 4 4 4 4 4 4 4 4 4 4 4 lOMoARcPSD| 36991220 2 0 0 4 5 5 5 9 9 9 9 9 9 9 3 0 0 4 5 6 6 9 10 11 11 11 15 15 4 0 3 4 5 7 8 9 10 12 13 14 15 15 5 1 3 4 5 7 8 9 10 12 13 14 15 16
17. (Bài toán balô 3) Cho n loại hàng (n 50). Mỗi món hàng thuộc loại thứ i có khối
lượng là A[i] và giá trị C[i] (số nguyên). Số lượng các món hàng của mỗi loại không
hạn chế. Cần chọn những món hàng của những loại hàng nào ể bỏ vào một ba lô sao
tổng giá trị của các món hàng ã chọn là lớn nhất nhưng tổng khối lượng của chúng
không vượt quá khối lượng W cho trước (W 100). Mỗi loại hàng có thể hoặc không
chọn món nào, hoặc chọn 1 món, hoặc chọn nhiều món. Input: n W A[1] C[1] A[2] C[2] … A[n] C[n] Ví dụ: 5 13 3 4 4 5 5 6 2 3 1 1 OutPut:
Tổng giá trị của các món hàng bỏ vào ba lô.
Số lượng của các loại hàng ã chọn. Trong ví dụ trên:
Tổng giá trị của các món hàng bỏ vào ba lô: 19 Các món ược chọn:
Chọn 1 món hàng loại 1, mỗi món có khối lượng là 3 và giá trị là 4 Chọn 5
món hàng loại 4, mỗi món có khối lượng là 2 và giá trị là 3 Hướng dẫn: Tổ chức dữ liệu: lOMoARcPSD| 36991220
Fx[k][v] là tổng giá trị của các món hàng bỏ vào ba lô khi có k loại hàng ầu tiên ể
chọn và khối lượng tối a của ba lô là v, với k [1, n], v [1, W]. X[k][v] là số lượng
các món hàng loại k ược chọn khi khối lượng tối a của ba lô là v. Giải thuật tạo bảng:
* Trường hợp ơn giản chỉ có 1 món ể chọn: Ta tính Fx[1][v] với mọi v:
X[1][v] = v/A[1]; (chia nguyên) Fx[1][v] = X[1][v] * C[1]
* Giả sử ta ã tính ược Fx[k–1][v] ến dòng k–1, với mọi v [1, W]. Khi có thêm loại
thứ k ể chọn, ta cần tính Fx[k][v] ở dòng k, với mọi v [1,W] Nếu ta chọn xk món
hàng loại k, thì khối lượng còn lại của ba lô dành cho các loại hàng từ loại 1 ến
loại k – 1 là: u = v – xk * A[k] Khi ó giá trị của ba lô là: Fx[k][v]= Fx[k–1][u] + xk * C[k]
Với xk thay ổi từ 0 ến yk, ta chọn giá trị lớn nhất và lưu vào Fx[k][v]. Trong ó yk =
v/A[k] (chia nguyên) là số lượng lớn nhất các món hàng loại k có thể ược chọn bỏ
vào ba lô, khi khối lượng tối a của ba lô là v.
Tóm lại: công thức ệ quy là:
Fx[k][v] = Max(Fx[k-1][v – xk * A[k]] + xk * C[k])
Max xét với xk thay ổi từ 0 ến v/A[k] (chia nguyên), và v – xk * A[k] > 0
Dưới ây là bảng Fx[k][v] và X[k][v] tính ược trong ví dụ trên. Bảng màu xám là X[k][v]: [k][v] 1 2 3 4 5 6 7 8 9 10 11 12 13 1
0 0 0 0 4 1 4 1 4 1 8 2 8 2 8 2 12 3 12 3 12 3 16 4 16 4 2
0 0 0 0 4 0 4 0 5 1 8 0 9 1 9 1 12 0 13 1 14 2 16 0 17 1 3
0 0 0 0 4 0 4 0 5 0 8 0 9 0 10 1 12 0 13 0 14 0 16 0 17 0 4
0 0 0 0 4 0 4 0 7 1 8 0 10 2 11 1 13 3 14 2 16 4 17 3 19 5 5
0 0 1 1 4 0 5 1 7 0 8 0 10 0 11 0 13 0 14 0 16 0 17 0 19 0
18. (Bài toán ổi tiền): Cho n loại tờ giấy bạc. Tờ giấy bạc thứ i có mệnh giá A[i]. Số tờ mỗi
loại không giới hạn. Cần chi trả cho khách hàng số tiền M ồng. Hãy cho biết mỗi loại
tiền cần bao nhiêu tờ sao cho tổng số tờ là ít nhất. Nếu không ổi ược, thì thông báo
“KHONG DOI DUOC”. N < 50; A[i] < 256; M < 10000 Input: n M lOMoARcPSD| 36991220 A[1] A[2] … A[n] Ví du: 3 18 3 10 12
Output: Tổng số tờ phải trả. Số tờ mỗi loại.
Hướng dẫn: (Cách 1, tương tự bài ba lô 3)
Gọi Fx[i][j] là số tờ ít nhất ược dùng ể trả số tiền j ồng khi có i loại tiền từ loại
1 ến loại i. Với i = 1 .. n; j = 1 .. M.
X[i][j] là số tờ giấy bạc loại thứ i ược dùng chi trả số tiền j ồng. * Trường
hợp ơn giản chỉ có 1 loại tiền ể chọn: Ta tính Fx[1][j] với mọi j
j div A[1] nếu j mod A[1] = 0 { Fx[1][ j] =
nếu j mod A[1] 0 (không ổi ược)
* Giả sử ta ã tính ược Fx[i–1][j] ến dòng i–1, với mọi j [1, M]. Khi có thêm loại
tiền thứ i ể chọn, ta cần tính Fx[i][j] ở dòng i, với mọi j [1, M]
Nếu ta chọn k tờ loại i, thì số tiền còn lại dành cho các loại tiền khác từ loại 1 ến
loại i – 1 là: u = j – k * A[k]
Khi ó tổng số tờ là: Fx[i][j]= Fx[i–1][u] + k
Với k thay ổi từ 0 ến kMax, ta chọn giá trị nhỏ nhất và lưu vào Fx[i][j]. Trong ó kMax
= j div A[k] là số tờ nhiều nhất của loại tiền i ể ổi số tiền j.
Tóm lại: công thức ệ quy là:
Fx[i,j] = Min(Fx[i-1, j – k * A[i]] + k)
Min xét với k thay ổi từ 0 ến j div A[i], và j – k * A[i] > 0 Hướng dẫn: (Cách 2)
Gọi Fx[i] là số tờ ít nhất ược dùng ể ổi số tiền i. Với i = 1 .. M.
Với quy ước Fx[i] = (hoặc 0) khi không ổi ược.
X[i] là loại tiền cuối cùng ược dùng ổi số tiền i. (chỉ lưu 1 loại tiền) Giải thuật tạo bảng:
Xếp mệnh giá A[i] tăng dần. lOMoARcPSD| 36991220
Khởi gán Fx[i] = , X[i] = 0 với mọi j = 1 .. M Gán Fx[0] = 0
Với số tiền i chạy từ 1 ến M, ta tính Fx[i] và X[i], bằng cách:
Nếu chọn loại tiền j thì số tiền còn lại là i – A[j]
Fx[i] = Min( Fx[i – A[j]] + 1) nếu i >= A[j] Min xét
với loại tiền j chạy từ 1 ến n.
X[i] = j ứng với giá trị min của Fx[i]
Dưới ây là mảng Fx[i] và X[i] tính ược trong ví dụ trên (dùng 3 loại tiền 3 ồng, 10
ồng, 12 ồng ể ổi số tiền 18 ồng) i
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Fx[i] 1 2 3 1 1 2 2 3 3
X[i] 0 0 0 1 0 0 1 0 0 1 2 0 3 2 0 3 2 0 3
19. (Phân công kĩ sư - Đề thi tuyển sinh sau Đại học khoá 1997 Đại học Tổng hợp TP
HCM) Một cơ sở phần mềm có n phòng máy vi tính. Cơ sở này phải tuyển chọn m kĩ
sư ể bảo trì máy. Sau khi tham gia ý kiến của các chuyên gia và kinh nghiệm của các
ơn vị khác, người ta hiểu rằng nếu phân công i kĩ sư chuyên bảo trì tại phòng máy j
thì số máy hỏng hằng năm phải thanh lí là a[i,j]. Do hạn chế về thời gian và iều kiện
i lại chỉ có thể phân công mỗi kĩ sư bảo trì tại một phòng máy.
Bảng ví dụ dưới ây với m = 5 (kĩ sư) và n = 3 (phòng máy). Số kĩ sư phòng máy 1 phòng máy 2 phòng máy 3 0 14 25 20 1 10 19 14 2 7 16 11 3 4 14 8 4 1 12 6 5 0 11 5
Yêu cầu: Tìm ra phương án phân công mỗi phòng máy phân bao nhiêu kĩ sư sao
cho tổng số máy phải thanh lí hằng năm là ít nhất.
Dữ liệu: vào từ file văn bản KiSu.inp có 2 dòng: lOMoARcPSD| 36991220
• dòng ầu gồm 2 số nguyên dương m, n. (m, n < 50) m+1 dòng tiếp theo bảng a[i][j].
Kết quả: ưa ra file văn bản KiSu.out gồm 2 dòng:
• Dòng ầu chứa tổng số máy (ít nhất) phải thanh lí hằng năm.
• Dòng thư hai chứa n số nguyên dương là số kĩ sư ược phân công bảo trì mỗi phòng máy.
Trong ví dụ trên, phân công 3 kĩ sư cho phòng máy 1, 1 kĩ sư cho phòng máy
2, và 1 kĩ sư cho phòng máy 3. Khi ó, hằng năm số máy ít nhất phải thanh lý là 37 máy. Ví dụ:
KiSu.inp ( ối với ví dụ trên) KiSu.out 5 3 37 14 25 20 3 1 1 10 19 14 7 16 11 4 14 8 1 12 6 0 11 5 Hướng dẫn:
Gọi F[i][j] là số máy hư ít nhất hằng năm khi có i kĩ sư ược phân công bảo trì j phòng máy ầu tiên.
19.1. (Tam phân a giác) Cho một a giác lồi n ỉnh. Hãy phân a giác này thành n– 2 tam giác
bằng n – 3 ường chéo, sao cho tổng của ộ dài của các ường chéo này là nhỏ nhất. Các
ường chéo này không cắt nhau (chỉ có thể giao nhau ở ỉnh của a giác).
Dữ liệu: vào từ file văn bản TAMPHAN.INP có n + 1 dòng:
• Dòng ầu chứa một số nguyên n là số ỉnh của a giác (3 < n < 50).
• Mỗi dòng trong n dòng kế tiếp chứa hai số thực là hoành ộ và tung ộ của mỗi ỉnh của a giác. lOMoARcPSD| 36991220
Kết quả: ưa ra file văn bản TAMPHAN.OUT, gồm dòng ầu chứa một số thực
(có 4 chữ số thập phân) là tổng nhỏ nhất của ộ dài của các ường chéo. Mỗi dòng
trong n – 3 dòng tiếp theo chứa 2 số nguyên là chỉ số của hai ỉnh của mỗi ường chéo ược chọn. Ví dụ: TAMPHAN.INP TAMPHAN.OUT 6 17.4859 2 1 2 6 2 4 3 6 6 6 3 5 10 6 10 3 7 0
Hướng dẫn: Gọi Fx[i][j] là tổng ộ dài ngắn nhất của các ường chéo khi tam
phân a giác có i ỉnh kể từ ỉnh thứ j.
20. (Trạm bưu iện) Trên một con ường thẳng, dài, số nhà của những nhà dọc theo một
bên ường là số o ộ dài tính từ ầu con ường (số nguyên). Người ta chọn ra k nhà làm trạm bưu iện.
Hãy xác ịnh số nhà của k nhà ó sao cho các nhà còn lại cách một trạm bưu iện
nào ó là gần nhất hay tổng khoảng cách của các nhà còn lại ến một trạm bưu iện
gần nhất nào ó là nhỏ nhất.
Dữ liệu: vào từ file văn bản BuuDien.inp gồm 2 dòng:
• Dòng ầu: chứa hai số nguyên n và k ( n < 300; k < 30), với n là tổng số
nhà trên con ường ó, k là số trạm bưu iện.
• Dòng thứ hai là các số nhà theo thứ tự tăng dần.
Kết quả: ưa ra file văn bản BuuDien.out gồm 2 dòng:
• Dòng ầu: là k nhà dùng làm trạm bưu iện.
• Dòng thứ hai là tổng khoảng cách của các nhà còn lại ến một trạm bưu iện gần nhất nào ó. Ví dụ: BuuDien.inp BuuDien.out lOMoARcPSD| 36991220 10 5 2 7 22 44 50 1 2 3 6 7 9 11 22 44 50 9
21. Cho hai dãy số D1và D2 mỗi dãy có từ 50 ến 150 số nguyên dương. Dãy số D3 ược
gọi là “dãy con chung” củaD1 và D2 nếu D3 nhận ược từ D1 (D2) bằng cách loại bỏ
một số >=0 số nào ó. Tìm dãy chung con có số lượng số nhiều nhất. Hướng dẫn:
Một dạng khác của bài toán xâu con chung