学习动态规划 day1 1201 整数划分

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201

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

有时,我可能脆弱得一句话就泪流满面,有时,也发现自己咬着牙走了很长的路。

猜你喜欢

转载自blog.csdn.net/passer__/article/details/81279505