[dp] 51nod P1201 整数划分

题目大意

  • 把n分成若干个不同正整数求方案数
  • 1+2+3与1+3+2视为不同

题解

  • 设f[i][j]表示j个数组成i的个数

  • 转移有两个,一个就是插入j时的f[i-j][j-1]个数

     

  • 然后就是因为要不同整数,不同的来源在哪里,就是将[i-j][i](其含义是i个数组成了i-j)中的每一个数加1

  •  

    所以f[i][j]=f[i-j][j]+f[i-j][j-1]

代码

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int N=50010,mo=1e9+7;
 5 int n,ans,f[N][350];
 6 int main()
 7 {
 8     scanf("%d",&n),f[0][0]=1;
 9     for (int i=1;i<350;i++) for (int j=0;j<=n;j++) if (j-i>=0) f[j][i]=(f[j-i][i]+f[j-i][i-1])%mo;
10     for (int i=1;i<350;i++) ans=(ans+f[n][i])%mo;
11     printf("%d",ans); 
12 }

 

posted @ 2019-07-10 16:55  BEYang_Z  阅读(144)  评论(0编辑  收藏  举报