Bài tập Pascal sưu tầm!

T

tmb12

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

bài 1: Chọn hoa
Nhân ngày 8/3 Minh đến cửa hàng bán hoa để mua hoa tặng mẹ. Mẹ Minh rất thích hoa lan, cửa hàng hiện đang có n (n ≤ 20) gi phong lan rất đẹp được đánh số từ 1 đến n, các giò phong lan đều đẹp như nhau nên Minh phân vân không biết chọn gi phong lan nào. Minh muốn mua tặng mẹ k (k ≤ n) gi phong lan. Em hãy tìm giúp Minh tất cả các cách có thể chọn.
Input: Tệp chonhoa.inp gồm một dòng chứa 2 số nguyên n, k
output: đưa ra màn hình tất cả các cách chọn có thể và tổng số cách chọn.
Ví dụ: Input: N = 4; k = 2
output: 1. 1 2
2. 1 3
3. 1 4
4. 2 3
5. 2 4
6. 3 4
tổng số cách chọn: 6
Bài 2: Phân tích số
Cho số tự nhiên n (n ≤ 400). Hãy cho biết có bao nhiêu cách phân tích số n thành tổng của dãy các số nguyên dương, các cách phân tích là hoán vị của nhau chỉ tính là một cách.
Ví dụ: Với n=5, có 7 cách phân tích:
1. 5 = 1 + 1 + 1 + 1 + 1
2. 5 = 1 + 1 + 1 + 2
3. 5 = 1 + 1 + 3
4. 5 = 1 + 2 + 2
5. 5 = 1 + 4
6. 5 = 2 + 3
7. 5 = 5
Bài 3: Có n thành phố được đánh số thứ tự 1, 2, …, n. Giữa hai thành phố bất kì có thể có một đường đi trực tiếp hoặc không có. Cho trước ma trận kề A = (aij) chứa dữ liệu về các đường đi trực tiếp, trong đó aij là độ dài đường đi trực tiếp từ thành phố i đến thành phố j, aij = 0 nếu giữa hai thành phố không có đường đi trực tiếp. Tìm độ dài của đường đi ngắn nhất từ thành phố 1 đến thành phố n, và cho biết đường đi đó qua những thành phố nào.
 
M

mikelhpdatke

2)

Mã:
program bai_4;
uses crt;
var n,m:integer;
x,t:array[0..100] of integer;

Procedure deq(i:integer);
 var j,k:integer;
  begin
   For j:=x[i-1] to (m-t[i-1])div 2 do
    begin
     x[i]:=j;
     t[i]:=t[i-1]+j;
     deq(i+1);
    end;
   x[i]:=m- t[i-1];
   For k:=i downto 1 do write(x[k],' ');
  writeln;
 end;

begin
 clrscr;
 write('nhap m=');readln(m);

 write('Cac cach chia..!');writeln;
 x[0]:=1;
 t[0]:=0;
 deq(1);

 readln
 end.
 
Last edited by a moderator:
M

mikelhpdatke

1>
Mình viết phần xương
Mã:
Procedure deq(i:integer);
Var j,l:integer;
 Begin
  For j:=x[i-1]+1 to n-k+i do
    Begin
     X[i]:=j;
     if i=k then begin For l:=1 to k do write(x[l],' ');writeln; end
Else Deq(i+1);
   End;
End;
BEGIN
 x[0]:=0;
Deq(1);
readln
end.
 
T

thiennu274

Bài 2

var a:array[1..100] of integer; n,i:integer;
procedure inkq(k:integer);
var i:integer;
begin
for i:= 1 to k do
if i<k then write(a,'+') else write(a);
writeln;
end;
procedure tach(n,k:integer);
var i,d:integer;
begin
if n=0 then inkq(k)
else
begin
if k=0 then d:=1 else d:=a[k];
for i:= d to n do
begin
a[k+1]:=i;
tach(n-i,k+1);
end;
end;
end;
begin
write('nhap mot so n= ');
readln(n);
for i:= 1 to n do
a:=1;
tach(n,0);
readln;
end.

bài phân tích số đây. Hình như bài 3 là đệ qui lun thì phải :confused::confused:
 
M

mikelhpdatke

Bài 3 có khi dùng QHĐ, nhưng cho thêm cái vd đi. Làm thế này nhiều trường hợp đặc biệt cũng nên~~
 
Q

quanghero100

Bài 2: Phân tích số
Cho số tự nhiên n (n ≤ 400). Hãy cho biết có bao nhiêu cách phân tích số n thành tổng của dãy các số nguyên dương, các cách phân tích là hoán vị của nhau chỉ tính là một cách.
Ví dụ: Với n=5, có 7 cách phân tích:
1. 5 = 1 + 1 + 1 + 1 + 1
2. 5 = 1 + 1 + 1 + 2
3. 5 = 1 + 1 + 3
4. 5 = 1 + 2 + 2
5. 5 = 1 + 4
6. 5 = 2 + 3
7. 5 = 5

Mã:
uses crt;
var n:integer;
    F:array[0..400,0..400] of int64;
procedure tinh;
var i,j:integer;
begin
   for i:=1 to n do
      begin
         F[0,i]:=0;
         F[i,0]:=1;
      end;
   for i:=1 to n do
      for j:=1 to n do
         if i>j then F[i,j]:=F[i-1,j]
         else F[i,j]:=F[i-1,j]+F[i,j-i];
end;
begin
   clrscr;
   readln(n);
   tinh;
   writeln(F[n,n]);
   readln;
end.
 
Q

quanghero100

Bài 3: Có n thành phố được đánh số thứ tự 1, 2, …, n. Giữa hai thành phố bất kì có thể có một đường đi trực tiếp hoặc không có. Cho trước ma trận kề A = (aij) chứa dữ liệu về các đường đi trực tiếp, trong đó aij là độ dài đường đi trực tiếp từ thành phố i đến thành phố j, aij = 0 nếu giữa hai thành phố không có đường đi trực tiếp. Tìm độ dài của đường đi ngắn nhất từ thành phố 1 đến thành phố n, và cho biết đường đi đó qua những thành phố nào.
Đây là một bài đồ thị dùng thuật Dijkstra :D:D
Mã:
uses crt;
var a:array[1..100,1..100] of integer;
    p,d:array[1..100] of integer;
    q: set of byte;
    n,s,c:integer;
    f:text;
procedure docfile;
var u,v,k,i,j:integer;
begin
  assign(f,'duongdimin.inp');
  reset(f);
  readln(f,n,s,c);
  fillchar(a,sizeof(a),0);
  for i:=1 to n do
     begin
          for j:=1 to n do
              read(f,a[u,v]);
         readln(f);
     end;
  close(f);
end;
procedure int;
var i:integer;
begin
  fillchar(d,sizeof(d),100);
  fillchar(p,sizeof(p),0);
  q:=[];
  for i:=1 to n do
   q:=q+[i];
  d[s]:=0;
end;
procedure xuli;
var u,v,i,t,min,k:integer;
begin
  t:=0;
  while q<>[] do
      begin
        min:=1000;
        for i:=1 to n do
          if (i in q) and (d[i]<min) then
            begin
               min:=d[i];
               u:=i;
            end;
        q:=q-[u];
        for v:=1 to n do
          if a[u,v]<>0 then
            begin
               t:=d[u]+a[u,v];
               if t<d[v] then
                 begin
                   d[v]:=t;
                   p[v]:=u;
                 end;
            end;
      end;
      writeln(d[c]);
end;
procedure truyvet;
begin
  while c<>s do
    begin
      write(c,'<--');
      c:=p[c];
    end;
  writeln(s);
end;
begin
  clrscr;
  docfile;
  int;
  xuli;
  truyvet;
  readln;
end.
À quên code này viết dưới dạng nhập vào 2 thành phố s và c sau đó tìm đường đi ngắn nhất từ thành phố s đến thành phố c, với đề bài bảo tìm đường đi ngắn nhất từ thành phố 1 đến thành phố n do đó khi test cần nhập s=1 và c=n thì sẽ cho ra kết quả còn không muốn như thế thì có thể điều chỉnh trong code lại một chút. Thân!!!
 
Last edited by a moderator:
Top Bottom