整数拆分

dp[i][j]表示将i拆成j个数

dp[i][j] = dp[i][i] j>=i

dp[i][j] = dp[i][j-1]+dp[i-j][j] else;

dp[i][j-1]表示第j个盘子不分

dp[i-j][j]表示先保证所有的盘子都有一个

边界dp[i][1] = 1, dp[0][j]=1

int dp[15][15];
int t;
signed main()
{
    sc(t)
    int M,N;
    while(t--){
        sc(M)sc(N)
        for(int i=0;i<=M;i++){
            dp[1][i]=1;
        }
        for(int i=2;i<=N;i++){
                dp[i][0]=1;
            for(int j=1;j<=M;j++){
                if(i>j)dp[i][j]=dp[j][j];
                else dp[i][j]=dp[i-1][j]+   dp[i][j-i];
            }
        }
        cout<<dp[N][M]<<'
';
    }
}
原文地址:https://www.cnblogs.com/liulex/p/12899161.html