Tổ hợp trong Pascal

Thứ bảy - 08/08/2020 09:28
Trong khi lập trình ta thường xuyên phải làm các thao tác sắp xếp, phân hoạch, lập tập con, hợp thành tập hợp lớn hơn...
1. KHÁI NIỆM
a) Trong khi lập trình ta thường xuyên phải làm các thao tác sắp xếp, phân hoạch, lập tập con, hợp thành tập hợp lớn hơn... trên một tập hợp các phần tử hữu hạn và rời rạc nghĩa là thường xuyên đụng chạm đến các khái niệm của giải tích tổ hợp, đó là:
+ Hoán vị
+ Chỉnh hợp
+ Tổ hợp
b) Hoán vị
- Một hoán vị của n phần tử là một bộ phận gồm n phần tử để được sắp xếp theo một trật tự nhất định, mỗi phần tử có mặt đúng một lần.
- Số các hoán vị khác nhau của n phần tử là:
Pn = n! = 1 x 2 x 3 x ... x n
c) Chỉnh hợp
- Một chỉnh hợp n chập r của n phần tử là một bộ sắp thứ tự gồm r phần tử lấy ra từ n phần tử đã cho.
- Số chỉnh hợp n chập r là:
 = n(n - l)...(n - r + 1)
 =
d) Tổ hợp
- Cho một tập x có n phần tử. Một tổ hợp n chập r của n phần tử đó là một tập con của X gồm có r phần tử. 
- Số tổ hợp n chập r là:
 =
 =

2. CÁC THUẬT TOÁN
a) Hoán vị
* Bài toán:
Viết chương trình in ra tất cả các hoán vị của N số tự nhiên đầu tiên.
* Thuật toán:
- Ta đặt mảng A[1..N] để chứa hoán vị tìm được.
- Mảng B[1..N] of Bollean để làm cờ với B[I] cho biết số i đã được chọn vào hoán vị hay chưa.
- Thuật toán được lập theo kiểu đệ qui với hai thủ tục là: PRINT và FIND (i: Byte).
- Thủ tục PRINT sẽ in ra hoán vị vừa tìm được.
- Thủ tục FIND (i: Byte) giúp tìm phần tử thứ i trong hoán vị và được gọi một cách đệ qui. Cơ chế hoạt động của nó như sau:

procedure FIND (i: Byte);
Var j: byte;
Begin
      if i > N then Xuat
      Else
          Begin
              For j := 1 to N do
                    if b[j] then
                        Begin
                                 a[i] := j
                                 b[j] := 0
                                 Find (i + 1)
                                 b[j] := 1;
                        end;
           end;
end;
* Ví dụ: N = 3

* Thể hiện bằng PASCAL:
PROGRAM HOANVI;
Const N = 3;
Var
     A: Array [1..N] of byte;
     B: Array [1..N] of 0..1;
     i, dem: integer;
Procedure xuat;
    var i: integer;
         Begin
             dem := dem + 1;
             write (’Hoan vi thu', dem, ’ ');
             For i:= 1 to N do write (A[i]);
             Writein ;
             readln ;
        end;
Procedure Find (i: byte);
     var j: byte;
     Begin
          if i > N then Xuat
          else
               Begin
                    For j := 1 to N do
                          if (B[j] = 1) then
                             Begin
                                  a[i] := j;
                                  b[j] := 0;
                                  find (i + 1);
                                  b[j] := 1;
                              end;
                   end;
          end;
BEGIN
     dem := 0;
     For i: 1 to N do B[i]:= 1;
     Find(l);
END.
b) Chỉnh hợp
* Bài toán:
Viết chương trình in ra tất cả các chỉnh hợp n chập r của số tự nhiên đầu tiên (r ≤ n).
* Thuật toán:
- Tương tự như phần hoán vị.
- Chỉ cần sửa thủ tục Find(i) lại như sau:
Procedure Find (i: byte);
      var j: byte
      Begin
           if i > r then xuat
           else...
* Ví dụ:
N = 3, r = 2


* Thể hiện bằng PASCAL:
PROGRAM CHINHHOP;
     Var
     A: Array [1..N] of byte;
     B: Array [1..N] of 0..1;
     i, j, dem: byte;
Procedure Xuat;
     Var
          i: byte;
      Begin
               dem := dem + 1;
               write (’Hoan vi thu dem, ':;
               For i: = 1 to r do write (A[i]);
              writein;
              Readln;
         end;
   Procedure Find (i: byte);
   Var j: byte;
    Begin
         if i > r -then Xuat
         else
              For j:= 1 to n do
                   if (B[j] = 1) then
                        Begin
                            A[i] := j;
                            B[j] := 0;
                            Find (i + 1);
                            B[j] := 1;
                        end;
    end;
BEGIN
      writeiln (‘Nhập r');
      Readln(r);
      Dem:= 0;
      For i : 1 to b do B[i] := 1;
      Find(l);
END.
c) Tổ hợp
* Bài toán:
Viết chương trình in ra màn hình tất cả các tổ hợp n chập r của các số nguyên từ 1 đến n.
* Thuật toán:
• THUẬT TOÁN 1:
- Tương tự như thuật toán tìm các chỉnh hợp n chập r nhưng ở đây ta chỉ cần chọn 1 chỉnh hợp có thứ tự tăng.
- Thủ tục Find được cải tiến như sau:
Procedure Find (k: byte);
Var
     j: byte;
Begin
     if k > r then xuat
     else
          Begin
               For j := 1 to n do
                    if b[j] and (j > a[k – 1]) then
                      begin
                              a[k] := j; .
                              b[j]:= False;
                              Find [k + 1];
                              b[i] := True;
                      end;
       end;
 End;
• THUẬT TOÁN 2.
- Do trong tổ hợp ta chỉ cần tìm từ nhỏ đến lớn và không cần quay lại nên ta có thể không cần tìm i đặt cờ B[1..N] of Boolean.
- Thủ tục Find (i: byte) có thể viết như sau:
Procedure Find (i: byte)
Var
     i: byte;
Begin
     If k > r then xuat
     Else
          For i:= (A[k - 1] + 1) to n do
               Begin
                   B[K] := i
                   Find (k + 1);
                   end;
    end;
• THUẬT TOÁN:
- Chỉ cần đặt các cờ A[1..N] of 0..1
- Lần lượt cho các A[i] bằng 1 hoặc 0
         A[i]:= 1: số i được chọn vào tổ hợp.
         A[i]:= 0: số i không được chọn vào tổ hợp.
■ Ví dụ: N = 3, r = 2
Giải thuật của ta chạy hết cây chọn lựa sau đây để tìm ra tất cả các tổ hợp 3 chập 2 của tập X = (1, 2, 3);


Thủ tục Find được viết lại như sau:
procedure Find (i: byte);
Var j: byte;
Begin
     if d > r then print
     Else
          if ((n + 1 - i) > (r - d)) then
               Begin
                   For j := 1 down to 0 do
                        A[i] := j;
                        d := d + j;
                        Find (i + 1);
                        d :=d - j;
                       A[i] := A[i] - j;
                 end;
end;

* Thể hiện bằng PASCAL:
PROGRAM TOHOP1;
Const n = 10
Var A: array [0..N] of byte;
       B: array [1..N] of Boolean;
       r, dem, t: integer;
procedure print;
var i: byte;
Begin
     Dem:= dem + 1;
     Write ('to hop thu', dem, 'la :');
     For i := 1 to r do write (a[i]);
     writeln;
     readln;
end;
{……………………………….}
Procedure Find (k: byte);
Var j: byte;
Begin
     if k > r then print
     else
          Begin
               For j:= 1 to n do
                if b[j] and (j > a[k - 1]) then
                      Begin
                           a[k] := j;
                           b[j] := False.;
                           Find [k + 1];
                           b[j] := True;
                      end;
          end;
end;
BEGIN
        write ('Cho biet so phan tu:’);
        Readin (r);
        dem := 0;
        For t: = 1 to n do b[t]:= true
        a[0] := 0;
        Find(l);
END.
{………………………….}

PROGRAM TOHOP2;
const N = 10;
Var A: array [0..N] of byte;
      dem, r: byte;
      {……………………..}
procedure print;
       Var i: byte;
       Begin
            Dem := dem + 1;
            For i: = 1 to r do write (A[i]);
            Writein;
            Readin;
      end;
{………………………….}

Procedure Find (j = byte);
    Var i: byte;
    Begin
         if j > r then print
         else
             For i:= A[j - 1] to n do
                   Begin
                        B[j] := i ;
                        Find(j + 1);
                   end;
    End;
BEGIN
    Dem := 0;
    a[0] := 0;
    Readln(r);
    Find(1);
END.
{………………………….}

PROGRAM TOHOP3;
Var A: array [0..n] of 0..1;
       r, d : byte;
procedure Print;
Var i: byte;
     Begin
         d := d + 1;
         write ('To hop thu', d, '{');
         For i := 1 to n do
              if A[i] := 1 then write (i);
              Write(‘{');
              Writeln;
              Readln;
end;
{………………………….}
Procedure Find (i = byte);
Var j: byte;
Begin
     if d > r then print
     Else
          if (n + 1 - i) > (r - d) then
          For j := down to 0 do
                   Begin
                       A[i] := j;
                       d := d + j
                       Find(i + 1)
                       d := d - j;
                   end;
End;
BEGIN
      d := 0;
      writeln ('Nhap r');
      Readln(r);
      Fill char (A, size of (A); 0);
      Find(l);
END.
Bản quyền bài viết thuộc về Sachgiai.com. Ghi nguồn Sách giải.com khi đăng lại bài viết này.

  Ý kiến bạn đọc

THÀNH VIÊN

Hãy đăng nhập thành viên để trải nghiệm đầy đủ các tiện ích trên site
Kênh Bóng đá trực tiếp hôm nay miễn phí
Kênh
90Phut TV full HD ⇔ 32win
69VN ⇔ 78 WIN ⇔ F168 ⇔ 123b

Vmax ⇔ 78Win ⇔ https://xn88.bio/
GK88 ⇔ SHBET ⇔ nh88 ⇔  ⇔ 789f
fo88vic88 ⇔ x88 ⇔ win678 ⇔ 69vn
BL555 ⇔  ⇔ KJC ⇔ Link MB66
mv66af88 ⇔ 8x bet ⇔ 88AA
789BET ⇔ LC88 ⇔ BL555 ⇔ 789f
OKFUN ⇔ 789F ⇔ MB66 ⇔ 8xbet
https://789betcom0.com/ ⇔ https://hi88.baby/
UU88 ⇔  ⇔ win678 ⇔ https://xx88.ink/
zo88 ⇔ ev99 ⇔ 888b ⇔ go88 ⇔ kèo nhà cái
 ⇔ 88aa ⇔ Kkwin ⇔ tv88 ⇔ 77win
mb66.racing ⇔ u888 ⇔ FO88 ⇔ 
188v ⇔ f168 ⇔ QQ88 ⇔ bk8 ⇔ bk8
789club ⇔ iwinclub ⇔ Subnhanh ⇔ Bluphim
m88 ⇔ Nettruyenviet ⇔ P3 ⇔ 8s
vn23 ⇔ SHBET ⇔ kubet ⇔ 888new
NOHU ⇔ hi88 ⇔ https://fun88.social/
thabet ⇔ SV88 ⇔ https://vnalo789c.com/
https://qq88.fun/ ⇔ f168 ⇔ 888New ⇔ QQ88
daga ⇔ SHBET ⇔ keo nha cai ⇔ bl-555.site
https://bshbet.com/ ⇔ https://uk88.rocks
BJ88 ⇔  ⇔ 8xbet ⇔ RR88 ⇔ 78WIN
mb6678win ⇔ https://hello8880.net/
tv88UU88 ⇔ 5mb ⇔ uu88 ⇔ 33win
NOHU ⇔ hi88com ⇔ 32win ⇔ Kuwin
ek333 ⇔ xoso66 ⇔ nổ hũ ⇔ SUN WIN
Fun88 ⇔ https://f168.com.co/ ⇔ 28Bet
NOHU ⇔ KINGFUN ⇔ https://789club24.com/
https://98winlive.com/ ⇔ https://789win.voyage/
https://bet88yk.com/ ⇔ https://alo789apk.app/
https://33win100.com/ ⇔ https://u888ny.com/
69vn ⇔ vn88 ⇔ OK8386 ⇔ x88 ⇔ SHBET
https://j88usd.com/ ⇔ https://79kings.blue/
https://dom88.jp.net/ ⇔ https://hello880.net/
https://789club60.com/ ⇔ https://blc88.net/
23win ⇔ 6ff ⇔ f168 ⇔ xoso66 ⇔ bomwin
nhatvip ⇔ https://789club24.com/ ⇔ 789 bet
win68 ⇔ 8xbet ⇔ go99 ⇔ 78win ⇔ QQ88
XX88 ⇔ ev99 ⇔ 69vn ⇔ rr88 ⇔ rr88
Uu88 ⇔ win456 ⇔ 78win ⇔ lương sơn tv
https://33win101.com/ ⇔ oxbet ⇔ Min88
78win ⇔ https://shbet.gg/ ⇔ XX88
daga ⇔ SV388 ⇔ OKFUN ⇔ ee88 ⇔ 12bet
hitclub ⇔ Kkwin ⇔ VankhanhTV ⇔ Hay 88
https://shbet.solar/ ⇔ https://58winbank.com/
68 game bàiEE88 ⇔ 77BET ⇔ 12BET
vmaxVMAX ⇔ ok9 football ⇔ K8CC
https://hi88o.com/ ⇔ https://hi88.gives/
https://qq88.co.com/ ⇔ https://f168.law/
8xbet ⇔ https://shbetk.net/ ⇔ RIKVIP ⇔ rikvip
https://mm88login.com/ ⇔ 79king
ww88 ⇔ https://78win.bot/ ⇔ https://13win.vegas/
https://lc88o.com/ ⇔ https://hi88.uno/
https://58win1.info/ ⇔ j88 ⇔ j88 ⇔ 69vn
bl555.com ⇔ 78 win ⇔ UU88 ⇔ 32 win
MM88 ⇔ wstar77 ⇔ 73bet ⇔ S666
11uu ⇔ 123B ⇔ 78win ⇔ 888win
789f ⇔ mv88 ⇔ YO88 ⇔ QQ88
789win ⇔ Bet88 ⇔ Vmax ⇔ Sun Win
tỷ lệ kèo nhà cái hôm nay ⇔ BIN88
https://j88.ventures/ ⇔ https://qq88.studio/
https://nh8811.com/ ⇔ Leo88
88CLB ⇔ SV388 ⇔ https://cakhiatv88.net/
7m ⇔ i9 Bet ⇔ Tv88 ⇔ hi88 ⇔ F8BET
socolive trực tiếp74bet ⇔ VN168
Bong88 ⇔ socolive ⇔  ⇔ 555WIN
https://au88.black/ ⇔ trực tiếp bóng đá
https://king88clb.com/ ⇔ https://f168hi.com/
sv66nhà cái thabet ⇔  ⇔ Nn88
https://32win.vc/ ⇔ 888new ⇔ PG88 ⇔ PG88
EE88 ⇔ SanClub ⇔ F168 ⇔ QQ88
hb88 ⇔ Vin777 ⇔ SV388 ⇔ MV66 ⇔ 32win
https://vankhanhtvv.com/ ⇔ Nhà Cái LC88
https://789fnew.com/ ⇔ https://u888lm.com/
https://sv66.coupons/ ⇔ https://f168.tech/
https://8kbetbh.com/ ⇔ https://ta88club.kim/
socolivemv88 ⇔ https://rr88.com.se/
https://qq88.photo/ ⇔ https://79king1.best
https://bet168.com.co/ ⇔ https://78winvina.com/
for88 ⇔ https://shbetasia.com/ ⇔ Bet88
https://888b-link.cc/ ⇔ https://sunwinn.deal/
88gokingfun ⇔ https://bong88vn.wiki/
https://mb66az.com/ ⇔ https://shbet.racing/
789f ⇔ 88i ⇔ https://new88blog.org/
Jun88 ⇔ Jun88 ⇔ jun88 ⇔ 67bet
MM88 ⇔ https://789betw.co/ ⇔ UU88
https://qq887p.com/ ⇔ https://w88link1.com/
xocdia88 ⇔ 77ball ⇔ vuabet88 ⇔ betvisa
https://789freal.com/ ⇔ https://2789f.com/
https://fun88link0.com/ ⇔ https://fun88link1.com/
https://188betlink0.com/ ⇔ https://188betlink1.com/
https://188betlink2.com/ ⇔ https://w88link0.com/
thabet ⇔ 32WIN ⇔ J88 ⇔ ax88 ⇔ 789F
QQ88 COM ⇔ https://xx88.sale/ ⇔ 78win
https://bet88.pictures/ ⇔ https://xo88.group/
https://86bet.tech/ ⇔ https://nohu90.consulting/
789BET ⇔ https://i9betz4.com/ ⇔ đá gà 88
w88link2.com ⇔ w88link3.com ⇔ luck8
https://8dayvip.mobi/ ⇔ https://8dayvip.com/
QQ88 Com ⇔ af88 ⇔ https://79kingsr.com/
https://pg99yk.com/ ⇔  hm88.com ⇔ J88
https://luongson161.tv/ ⇔ 78WIN ⇔ MB66
78win ⇔ U888 ⇔ nn88 ⇔ 99win ⇔ hi88
https://8kbettt.com/ ⇔ https://hi88.biz/
https://thabetcasino.us.com/ ⇔ 789Win ⇔ vn88
https://hello88net.com/ ⇔ https://pg88.jpn.com/
https://az8888.org/ ⇔ https://fly88.gifts/
lc88 ⇔ VN88 ⇔ 69vn ⇔ nh88 ⇔ vn88
GO8 ⇔ 888new ⇔ sv388
tỷ lệ kèo nhà cái 88 ⇔ PG66 ⇔ 68win
BL555 ⇔ 23win ⇔ SV388 ⇔ SHBET ⇔ hitclub
Game bài đổi thưởng ⇔ https://saobet.shop/
https://99ok99ok.com/ ⇔ UU88 ⇔ HM88
https://bet88.ventures/ ⇔ bongdalu22.com
zx88 ⇔ ev99 ⇔ 8s ⇔ bet8s ⇔ QQ88
https://f168.name/ ⇔ https://13wincom.io/
Nhà cái vn88 ⇔ Nhà Cái QQ88
https://fb888.in.net/ ⇔ https://kjc.ac/
https://onbet.in.net/ ⇔ link vn88
http://58win.trading/ ⇔ https://qq88.gives/
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây