51nod 1201 (dp)
整数划分
将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种。由于数据较大,输出Mod 10^9 + 7的结果即可。
Input
输入1个数N(1 <= N <= 50000)。
Output
输出划分的数量Mod 10^9 + 7。
Input示例
6
Output示例
4
【分析】注意到划分后,每个集合里数的个数不超多350个,然后考虑dp[i][j]表示将数字i化成j个数相加,
然后将这j个数每个数+1,即可得到数字i+j,若将这j个数+1,在添加一个 “1”,即可得到i+j+1。
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define mp make_pair #define rep(i,l,r) for(int i=(l);i<=(r);++i) #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N =5e4 + 50;; const int M = 17; const int mod = 1e9+7; const int mo=123; const double pi= acos(-1.0); typedef pair<int,int>pii; int n; int dp[N][350]; int main(){ scanf("%d",&n); dp[1][1]=1; for(int i=1; i<350; i++){ for(int j=1; j<=n; j++){ if(i+j<=n)dp[i+j][i]=(dp[i+j][i]+dp[j][i])%mod; if(i+j+1<=n&&i+1<350)dp[i+j+1][i+1]=(dp[i+j+1][i+1]+dp[j][i])%mod; } } int ans=0; for(int i=1; i<350; i++)ans=(ans+dp[n][i])%mod; cout<<ans<<endl; return 0; }