Description
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3 (6<n<=200,2<=k<=6),下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
Input
n,k
Output
一个整数,即不同的分法。
Sample Input
7 3
Sample Output
4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
解题思路:首先将正整数n分解成k个正整数之和的不同分解方案总数等于将正整数n-k分解成任意个不大于k的正整数之和的不同分解方案总数,递推公式为:p[i,j]:=p[i,j]+p[i-x,min(i-x,x)];,最后输出p[n-k,k]即可。
程序:
const
maxn=200;
maxk=6;
var
i,j,k,n,x:longint;
p:array[0..maxn,0..maxk] of longint;
function min(x,y:longint):longint;
begin
if x
exit(y);
end;
begin
readln(n,k);
fillchar(p,sizeof(p),0);
p[0,0]:=1;
for i:=1 to n do
p[i,1]:=1;
for i:=1 to n-k do
for j:=2 to min(i,k) do
for x:=1 to min(i,j) do
p[i,j]:=p[i,j]+p[i-x,min(i-x,x)];
writeln(p[n-k,k]);
end.