重要公式的推导
在a个苹果中,选出b个苹果出来,现有一个苹果p;
1.选这个苹果的方案相当于在剩余的a-1个苹果中选b-1个苹果
2.不选这个苹果的方案相当于在剩余的a-1个苹果中选b个苹果
将1,2两种方案相加就是在a个苹果中选择b个苹果
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2010,mod=1e9+7;
int c[N][N];//将所有的组合方式都预处理出来
void init()
{
for(int i=0;i<=2000;i++)
for(int j=0;j<=i;j++)
if(!j) c[i][j]=1;
else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
int main()
{
int n;
scanf("%d",&n);
init();
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",c[a][b]);
}
return 0;
}
这个截图的怎么上传的啊,我搞不明白
有点像背包问题?动态规划?
现有一个苹果p,那是先在a中拿出了一个吗
为什么预处理的时候,j<=i ?
i代表a,j代表b,根据组合数的定义b应该小于等于a,所以j <= i。
清晰
受益匪浅