Professional Documents
Culture Documents
Bài toán chia phần thưởng - 537020
Bài toán chia phần thưởng - 537020
Cần chia hết m phần thưởng cho n học sinh sắp theo thứ tự từ giỏi trở xuống sao
cho mỗi bạn nhận được phần thưởng không ít hơn phần thưởng của bạn xếp sau
mình (có thể số phần thưởng = 0), 1<=m,n<= 70. Tính số cách chia phần thưởng.
Cách phát biểu khác của bài toán: Có m phần thưởng được chia cho n học sinh
giỏi được xếp hạng thừ 1 đến n. Tính số cách chia phần thưởng sao cho thỏa các
Số phần thưởng của học sinh hạng i phải lớn hơn hoặc bằng số phần thưởng
Tất cả phần thưởng đều phải được thưởng hết cho học sinh.
Ví dụ: Có 7 phần thưởng chia cho 4 học sinh sẽ có 11 cách chia sau:
Gọi C[i,j] là số các chia i phần thưởng cho j học sinh, ta có một số nhận xét sau:
Có i phần thưởng mà chia cho 0 học sinh thì có 0 cách chia (vì không thỏa
điều kiện: Tất cả phần thưởng đều phải được thưởng hết cho học sinh). Vậy
Có 0 phần thưởng mà chia cho j học sinh thì có 1 cách chia (không ai có
Nếu số phần thưởng (i) ít hơn số học sinh (j) thì những học sinh thứ i+1 đến
bằng số cách chia i phần thưởng cho i người . Vậy với mọi i<j, C[i,j]=C[i,i].
Nếu số phần thưởng (i) nhiều hơn hoặc bằng số học sinh (j) thì có 2 trường
hợp:
+ TH1: người cuối cùng không có phần thưởng, tức là chỉ chia i phần
thưởng cho j-1 người, trường hợp này số cách chia là C[ i ][ j-1 ].
+ TH2: người cuối cùng chắc chắn có phần thưởng, khi đó ta sẽ lấy j phần
thưởng chia cho j người, mỗi người sẽ có được 1 phần thưởng trước, lúc này
còn lại i-j phần thưởng, tiếp tục lấy số còn lại này chia cho j người, trường
PROGRAM chia_phan_thuong;
BEGIN
FOR i:=1 TO m DO
FOR j:=1 TO n DO
IF i<j THEN
C[i,j]:=C[i,i]
ELSE
C[i,j]:=C[i,j-1] + C[i-j,j];
readln
END.
#include <iostream>
int m,n;
int C[71][71];
int main()
cin>>m>>n;
int i,j;
if (i<j)
C[i][j] = C[i][i];
else
cout<<C[m][n]<<endl;
return 0;
PROGRAM chia_phan_thuong;
VAR m,n,r:LONGINT;
P:ARRAY[0..70] OF LONGINT;
thu j}
VAR k:INTEGER;
BEGIN
BEGIN
BEGIN
writeln;
END;
END
ELSE
FOR k:=P[j-1] DOWNTO 0 DO {So phan thuong cua nguoi sau phai nho hon
IF i-k>=0 THEN {So phan thuong con lai phai khong am}
BEGIN
P[j]:=k;
Chia(i-k,j+1); {Chia so phan thuong con lai cho nhung nguoi sau.}
END;
END;
BEGIN
readln(m,n);
r:=0;
P[0]:=m;
Chia(m,1);
readln;
END.
#include <iostream>
int m,n,r;
int P[71];
if (n>::n)
if (m==0)
r++;
cout<<endl;
else
if (m-i>=0)
P[n]=i;
Chia(m-i,n+1);
int main()
{
cin>>m>>n;
r=0;
P[0]=m;
Chia(m,1);
return 0;