4 10 20
5 42 627
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <string> #include <cmath> #include <set> #include <queue> #include <algorithm> #include <vector> #include <stack> const double PI = acos(-1.0); using namespace std; #define esp 1e-8 const int inf = 99999999; //freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取 //freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中 int dp[122]; void init() { memset(dp, 0, sizeof(dp)); dp[0] = 1; for (int i = 1; i <= 120; ++i) { for (int j = i; j <= 120; ++j) //完全背包 dp[j] += dp[j - i]; } } int main() { init(); int n; while (~scanf("%d", &n)) cout << dp[n] << endl; }
if (i >j) d[i][j] = d[i-j][j] + d[i][j-1]; 意思就是如果i>j,那么有两种方式:一种是先把i里面分理处j个1,然后再把i-j拆成最多i-j个数字;另一种是把i拆分成最多j-1个数字。
if (i < j) d[i][j] = d[i][i]; 意思就是如果i<j,那么这种情况和把数字i最多拆成i个数字的是一样的。
if (i == j) d[i][j] = d[i][j-1] + 1; 意思就是如果i==j,那么可以把数字i拆分成j-1个数字,也可以把数字i拆分成i个1(这个就是那个1的意义)
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <string> #include <cmath> #include <set> #include <queue> #include <algorithm> #include <vector> #include <stack> const double PI = acos(-1.0); using namespace std; #define esp 1e-8 const int inf = 99999999; //freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取 //freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中 int dp[122][122]; void init() { memset(dp, 0, sizeof(dp)); for (int i = 1; i <= 120; ++i) dp[i][1] = 1; for (int i = 1; i <= 120; ++i) { for (int j = 1; j <= 120; ++j) { if (i > j) dp[i][j] = dp[i - j][j] + dp[i][j - 1]; else if (i == j) dp[i][j] = dp[i][i - 1] + 1; else dp[i][j] = dp[i][i]; } } } int main() { init(); int n; while (~scanf("%d", &n)) cout << dp[n][n] << endl; }