放苹果

状态表示:

(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) = egin{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;
}

原文地址:https://www.cnblogs.com/fxh0707/p/14920056.html