算法提高 数的划分
时间限制:1.0s 内存限制:256.0MB
问题描述
一个正整数可以划分为多个正整数的和,比如n=3时:
3;1+2;1+1+1;
共有三种划分方法。
给出一个正整数,问有多少种划分方法。
输入格式
一个正整数n
输出格式
一个正整数,表示划分方案数
样例输入
3
样例输出
3
数据规模和约定
n<=100
分析:将数n分别分为1~n段并对每段递归操作,若段数为1则为一种分法。若单纯递归会超时。这里采用记忆化搜索来减小时间复杂度。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int dp[101][101][101] = { 0 };
int f(int i, int n, int k) {
if (dp[i][n][k] != -1) {
return dp[i][n][k];
}
if (k == 1) {
return 1;
}
int ans = 0;
for (int j = i; j <= n / k; j++) {
ans += f(j, n - j, k - 1);
}
dp[i][n][k] = ans;
return ans;
}
int main() {
int ans = 0;
fill(dp[0][0], dp[0][0] + 101 * 101 * 101, -1);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
ans += f(1, n, i);
}
cout << ans << endl;
return 0;
}