放苹果

状态表示:

\(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;
}

posted @ 2021-06-22 19:50  Dazzling!  阅读(61)  评论(0编辑  收藏  举报