[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 }