组合求解问题

方法1

解题思路: 
1:组合求解如求C(8,5);等于8!/(3!*5!)=(8*7*6)/(1*2*3);
2:将m=(n-m)>m?(n-m):m;
3:(m+1)到n的累乘除以1到(n-m)的累乘 。 

#include<iostream>
using namespace std;
long long C(int n,int m)
{
	long long t=1;
	m=(n-m)>m?(n-m):m;
    for(int i=m+1;i<=n;i++)
    t*=i;
    for(int i=1;i<=n-m;i++)
    t/=i;
    return t;
   	
} 
int main()
{
   long long n,m;
   cin>>n>>m;
   cout<<C(n,m);
   cout<<endl;
   return 0;
} 

方法2

/*解题思路: 
1:类似于杨辉三角形,除边界外,其值也等于两肩上的值的和,
  如C(8,5)=C(7,5)+C(7,4); 
2:针对边界如C(8,0)=1等不影响,条件不满足自动往下;
*/

#include<iostream>
using namespace std;
long long C(int n,int m)
{
	long long t=1;
	if(m==0||m==n)
	return 1;
	else
	return C(n-1,m)+C(n-1,m-1);  	
} 
int main()
{
   long long n,m;
   cin>>n>>m;
   cout<<C(n,m);
   cout<<endl;
   return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42387291/article/details/83410395