Cho một số tự nhiên n (3<=n<=1000). Phân tích n thành các tổng sao cho mỗi tổng gồm
đúng k số hạng. Các số hạng của tổng
phải lớn hơn 0 và trong mỗi tổng không có 2 số hạng giống nhau. Hai tổng được gọi
là khác nhau nếu chúng khác nhau ít nhất một số hạng.
Viết chương trình giải quyết các bài toán trên theo các
yêu cầu sau:
Input cho trong tập tin CAU1.INP gồm 01 (một) dòng duy nhất ghi
giá trị n và k, mỗi giá trị cách nhau ít nhất một ký tự trắng.
Output ghi vào tập tin CAU1.OUT là kết quả của bài toán, mỗi tổng
ghi trên một dòng. Trong mỗi tổng, các số hạng cách nhau ít nhất một ký tự trắng..
Chương trình ví
dụ:
CAU1.INP |
CAU1.OUT |
8 3 |
1 2 5 1 3 4 |
CODE THAM KHẢO:
Var mTest : Array[1..100] Of Integer;
N, K : Integer;
Procedure Print;
Var i : Integer;
Begin
For i := 1 To K Do Write(mTest[i], ' ');
WriteLn;
End;
Procedure Process;
Var i, j, T : Integer;
kt : Boolean;
Begin
T := 0;
For i := 1 To K Do T := T + mTest[i];
kt := True;
If T = N Then Begin
For i := 1 To K-1 Do
For j := i+1 To K Do
If mTest[i] >= mTest[j] Then kt := False
End Else kt := False;
If kt Then Print;
End;
Procedure Test(m : Integer);
Var i : Integer;
Begin
For i := 1 To N Do Begin
mTest[m] := i;
If m = K Then Process Else Test(m + 1);
End;
End;
Begin
assign(input,'cau1.inp'); reset(input);
assign(output,'cau1.out'); rewrite(output);
ReadLn(N, K);
If Not ((3 <= N) And (N <= 1000) And (K > 0)) Then Begin
Write('Input khong hop le');
ReadLn;
Exit;
End;
Test(1);
close(input); close(output);
End.
Đăng nhận xét