整数分解
【问题描述】
把3分解成两个正整数的和,有两种分解方法,分别是 3 = 1 + 2 和 3 = 2 + 1。注意顺序不同算不同的方法。
将5分解成三个正整数的和,有6种分解方法,分别是 1 + 1 + 3 = 1 + 2 + 2 = 1 + 3 + 1 = 2 + 1 + 2 = 2 + 2 + 1 = 3 + 1 + 1。
请问,将2021分解成五个正整数的和,有多少种分解方法?
方法一
记忆化搜索
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[10][2030];
//前面的数是代表着分解成了几个数
//后面的数代表着所分解的数的大小
ll dfs(int k,int n)
{
if(f[k][n]!=-1)return f[k][n];
if(!k)
//这里说明了,如果k是0那么只有在n是0的时候才可以有一种情况,否则都是不成立的
{
if(!n)
return 1;
return 0;
}
f[k][n]=0;//初始值
for(int i=1;i<=n;i++)
f[k][n]+=dfs(k-1,n-i);//妙啊,细细品味啊
return f[k][n];
}
int main()
{
memset(f,-1,sizeof f);
cout<<dfs(5,2021)<<endl;
return 0;
}
方法二
隔板法
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long num1=1;
int num2=4*3*2*1;
for(int i=2020;i>=2017;i--)
num1*=i;
cout<<num1/num2;
return 0;
}