题目描述
给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。与“自然数拆分问题”类似,同样需要满足方案的不重复。
若满足集合A=B,则称这两种拆分方式是重复的。
例如 5 = 3 + 2 和 5 = 2 + 3, 就是重复的拆分方式。
现在需要你求满足条件的拆分有多少种?
输入格式:
第一行自然整数T,表示之后测试数据组数, 以后T行,每行一个自然数N,(1<N<=4000)
输出格式:
T行,每行输出一个整数,表示拆分的方案数,结果对2147483648取模。
输入样例:
2 6 7
输出样例:
11 15
参考代码:
#include<bits/stdc++.h> using namespace std; #define LEN 4001 #define MOD 2147483648 int main () { int t; cin >> t; while(t--){ int n; cin >> n; long long dp[LEN]={0}; dp[0]=1;//自然数包含自身的情况,如:7=7 for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ dp[j]=(dp[j]+dp[j-i])%MOD;//递推式 } } cout << dp[n] << endl; } return 0; }