http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201
又是一道不看题解我根本想不到的dp题(;´д`)ゞ
d p [ i ] [ j ] 表示 i 这个数是由 j 种不同的数组成的
那么怎么转移喃?
你看:
比如 d p [ 6 ] [ 3 ] = { 1 , 2 , 3 }
如果这 j 个数要是都加1,是不是就是转移到 d p [ i + j ] [ j ] 上了
即: d p [ 9 ] [ 3 ] = { 2 , 3 , 4 } ,而这种最小都是 2 ,那就还阔以再加个 1
即: d p [ 10 ] [ 4 ] = { 1 , 2 , 3 , 4 }
所以 d p [ i ] [ j ] 阔以向 d p [ i + j ] [ j ] , d p [ i + j + 1 ] [ j + 1 ] 两个方向转移

那么倒过来:
d p [ i ] [ j ] 就会有两个方向转移而来,就是:
d p [ i ] [ j ] = d p [ i j ] [ j ] + d p [ i j ] [ j 1 ]

i 最多就 = 1 + 2 + 3 + . . . + j = ( 1 + j ) j 2
所以 i >= j j 2
所以 2 i >= j

#include"iostream"
#include"math.h"
using namespace std;
const int MOD=1e9+7;
int dp[50005][320];
int main()
{
    for(int i=1;i<=50000;i++)dp[i][1]=1;
    for(int i=2;i<=50000;i++)
    {
        for(int j=1;j<=sqrt(i*2)&&j<i;j++)
        {
            dp[i][j]=(dp[i-j][j]+dp[i-j][j-1])%MOD;
        }
    }
    int N;
    while(cin>>N)
    {
        long long sum=0;
        for(int i=1;i<=sqrt(N*2);i++)
        {
            sum+=dp[N][i];
            sum%=MOD;
        }
        cout<<sum<<"\n";
    }
}