The division of integers is a classic problem, with many variants. To sum up, there are probably the following variants:
1) divide N into the sum of several positive integers
2) divide N into the number of sums of several different positive integers.
3) divide N into the number of sums with no more than k Positive Integers
4) divide N into the number of bins with no more than k different positive integers
5) divide N into the sum of positive integers whose maximum number is not greater than K
6) divide N into the sum of several consecutive positive integers.
Ohoh, why so many @@
Deformation (1): Divide N into the sum of several positive integers. For example, 6 can be divided as follows:
6
5 + 1
4 + 2, 4 + 1 + 1
3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1
2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1
So the answer should be 11.
Analysis:
Based on the relationship between N and M, consider the following situations:
(1) When n = 1, no matter how much m is (M> 0), there is only one division: {1 };
(2) When M = 1, no matter how many N values are, there is only one division of N 1, {, 1,..., 1 };
(3) When n = m, there are two possible conditions:
(A) if the Division contains N, only one is {n };
(B) If n is not included in the Division, the maximum number in the Division must be smaller than N, that is, all (n-1) Division of N.
Therefore, F (n, n) = 1 + f (n, n-1 );
(4) When n <m, it is equivalent to F (n, n) because it cannot be a negative number in the Division );
(5) but n> M, whether or not the maximum M is included in the Division can be divided into two situations:
(A) The Division contains M, that is, {M, {x1, x2 ,... XI }}, {x1, x2 ,... the sum of Xi} is n-M, and m may appear again. Therefore, it is the M division of (n-m,
Therefore, the number of such partitions is F (n-M, M );
(B) if the Division does not contain M, all values in the Division are smaller than m, that is, the number of n (m-1) partitions is F (m-1 );
Therefore, F (n, m) = f (n-M, m) + f (m-1 );
Therefore, if DP [N] [m] is set, n is divided into a maximum of M.
DP [N] [m] = 1 (M = 1)
DP [N] [m] = DP [N] [M-1] + 1 (M = N)
DP [N] [m] = DP [N] [N] (M> N)
DP [N] [m] = DP [N] [M-1] + dp [n-M] [m] (M <n)
Code:
[CPP] view plain
Copy
# Include <cstdio>
# Include <cstring>
# Define maxn500
Using namespace STD;
Int DP [maxn] [maxn];
Int main ()
{
Int I, J;
Memset (DP, 0, sizeof (DP ));
For (I = 1; I <maxn; ++ I)
DP [I] [1] = 1;
For (I = 1; I <maxn; ++ I)
For (j = 1; j <maxn; ++ J ){
If (I> J)
DP [I] [J] = DP [I] [J-1] + dp [I-j] [J];
Else if (I = J)
DP [I] [J] = DP [I] [J-1] + 1;
Else DP [I] [J] = DP [I] [I];
}
}
Deformation (2): dividing N into the sum of several different positive integers toj.3511 Staircases
Still DP, the transfer equation is a [k] [N] = A [k + 1] [N] + A [k + 1] [n-k]; A [k] [N] indicates the division of N into numbers not less than K.
Initialize to a [n] [N] = 1; A [k] [N] = 0 (k> N ).
Code:
[CPP] view plain
Copy
# Include <cstdio>
# Include <cstring>
# Define maxn500
Using namespace STD;
Int DP [maxn] [maxn];
Int main ()
{
Int I, J;
Memset (DP, 0, sizeof (DP ));
For (I = 1; I <maxn; ++ I)
DP [I] [I] = 1;
For (I = 2; I <maxn; ++ I)
For (j = 1; j <I; ++ J)
DP [J] [I] = 0;
For (I = 2; I <maxn; ++ I)
For (j = I-1; j> = 1; -- J)
DP [J] [I] = DP [J + 1] [I] + dp [J + 1] [I-j];
}
Deformation (3): Divide N into the number of sums of no more than k Positive Integers
Solution: DP [I] [J] indicates the number of parts divided by I into J, which is converted to Sigma (DP [N] [I]) (I <= K );
The transfer equation of DP [I] [J] Is DP [I-1] [J-1] + dp [I-j] [J];
See the http://wurong81.spaces.live.com/blog/cns for details! 5eb4a630986c6ecc! 254. Entry
Code:
[CPP] view plain
Copy
# Include <cstdio>
# Include <cstring>
# Define maxn500
Using namespace STD;
Int DP [maxn] [maxn];
Int main ()
{
Int I, J;
// Calculate the number of parts divided into M parts.
For (I = 1; I <maxn; ++ I)
For (j = 1; j <= (I <m? I: m); ++ J)
DP [I] [J] = DP [I-1] [J-1] + dp [I-j] [J];
}
Deformation (4): Divide N into the number of sums of up to k different positive integers
Solution: it is the meaning of the equation of deformation 2. A [k] [N] indicates the number of sums that divide N into numbers not greater than K portions.
Deformation (5 ):
Deformation (6): This is the simplest. N can be written as the sum of consecutive k (k> = 2) positive integers, then K <= SQRT (2 * n );
Enable I to cycle from K to 2. If I is an odd number and N % I = 0, it can be divided into the number of I, and the first number is N/I-I/2;
If I is an even number and N % I = I/2, it can be divided into the number of I, the first number is (N-1)/I-I/2 + 1;