天天看点

放苹果

放苹果

状态表示:

\(f(i,j)\):\(i\)的\(j\)划分总数。

状态转移:

考虑\(n\)的\(m\)划分\(a_i(\sum_{i = 1}^ma_i=n\)):

  1. 如果对于每个\(i\)都有\(a_i > 0\),那么\(\{a_i-1\}\)就对应了\(n-m\)的\(m\)划分。
  2. 如果存在\(a_i=0\),这就对应了\(n\)的\(m-1\)划分。

\[f(i,j) = \begin{cases}

f(i,j-1)+f(i-j,j) & i \ge j

\\

f(i,j-1) & i < j

\end{cases}

\]

如果\(i<j\),那么\(i\)的\(j\)划分必存在\(a_i=0\)。

\[f(0,0 \sim m)=1

const int N = 1010;
int f[N][N];
int n,m;

int main()
{

    while(cin >> n >> m)
    {
        for(int i = 0; i <= m; i++) f[0][i] = 1;
        
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
            {
                if(i >= j) f[i][j] = f[i][j - 1] + f[i - j][j];
                else f[i][j] = f[i][j-1];
            }
            
        cout << f[n][m] << endl;
    }
    //system("pause");
    return 0;
}