求组合数 2020/11/25
#include <iostream>
using namespace std;
//求组合数
int calculation(int n,int m)
{
if (m == 1)//从n中取一个结果即为n
{
return n;
}
if (m == n)//m和n相等结果为1
{
return 1;
}
return calculation(n - 1, m - 1)%1000000007 + calculation(n - 1, m)%1000000007;
}
int main()
{
int n, m;
cin >> n >> m;
cout<<calculation(n,m);
}
这样的题目给出个关系式,要想用递归来写不难。但是问题在于运行的时间太长,内存超限。
我们可以用预处理的思想先算出结果。
#include <iostream>
using namespace std;
const int mod = 1000000007;
//求组合数
int c[2010][2010];
int main()
{
int n, m;
cin >> n >> m;
c[0][0] = 1;
for (int i = 1; i <= 2000; i++)
{
c[i][0] = 1;//m等于0的时候,不论n为多少,组合数都为0
for (int j = 1; j <= i; j++)
{
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
c[i][j] %= mod;
}
}
cout << c[n][m] << endl;
return 0;
}
用递推代替了递归大大缩减了程序所需的时间和空间。
这样的问题处理了很多,这样可以由前面的递推到后面的问题一般都可以用预处理和递推大大简化。