【CHOJ 5202】自然数拆分Lunatic版【DP】【完全背包】

题目大意:

题目链接:http://contest-hunter.org:83/contest/0x50「动态规划」例题/5202 自然数拆分Lunatic版
求一个自然数能被多少个除零和自己以外的自然数相加得到。答案取模2312^{31}


思路:

由于每一个自然数可以被无限次使用,所以这道题是一道完全背包的题目。
f[i]f[i]为达到ii的方案总和取模2312^{31}的值,那么就有方程f[i]=(f[i]+f[ij])%MOD  (1jin)f[i]=(f[i]+f[i-j])\%MOD\ \ (1\leq j\leq i \leq n)


代码:

#include <cstdio>
#define MOD 2147483648ll
using namespace std;

int n;
long long f[4001];

int main()
{
	scanf("%d",&n);
	f[0]=1;
	for (int j=1;j<=n;j++)
	 for (int i=j;i<=n;i++)
	  f[i]=(f[i]+f[i-j])%MOD;
	printf("%lld\n",f[n]%MOD-1);
	return 0;
}
posted @ 2018-08-18 15:28  全OI最菜  阅读(80)  评论(0编辑  收藏  举报