题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
将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
想法:对于N肯定最多划分成350个数字对吧,因为最解N而且保证是不同整数的话 最小的话是S(1+2+3+~+~+~+n) 就是n*(n+1)=2*N.这样n就是350。
DP[i][j] 代表组成和为i用了j-1个数的方案数
dp[i][j] = dp[i-j][j-1]+dp[i-j][j] 表示组成和等于 i 的 j的数可以由组成和 i - j 的 j个 每个数都加上1 或者 i - j 其中 j-1个数 每个数都+1 然后再加上一个1 这样组成
扫描二维码关注公众号,回复:
2550842 查看本文章
#include<bits/stdc++.h>
using namespace std;
int dp[50005][400];
const int mod = 1e9+7;
int main()
{
int n;
scanf("%d",&n);
dp[0][0]=1;
for(int i=0;i<=350;i++)
{
for(int j=0;j<=n;j++)
{
if(j>=i)
dp[j][i] = ( dp[j-i][i] + dp[j-i][i-1] )%mod;
}
}
int ans=0;
for(int i=0;i<=350;i++)
ans=(ans+dp[n][i])%mod;
printf("%d\n",ans);
return 0;
}
有时,我可能脆弱得一句话就泪流满面,有时,也发现自己咬着牙走了很长的路。