hdu 2065(모 함수)

1973 단어 수학.
배열 조합
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1726    Accepted Submission(s): 724
Problem Description
n 가지 아 이 템 이 있 고 모든 아 이 템 의 수량 을 알 고 있 습 니 다.그 중에서 m 개 아 이 템 의 배열 수 를 선택해 야 합 니 다.예 를 들 어 두 가지 아 이 템 이 있 는데 A,B 이 고 수량 이 모두 1 이 며 그 중에서 두 가지 아 이 템 을 선택 하면'AB','BA'두 가지 가 배열 된다.
 
Input
각 조 의 입력 데 이 터 는 두 줄 이 고 첫 번 째 줄 은 두 개의 수 n,m(1<=m,n<=10)로 물품 수 를 나타 내 며 두 번 째 줄 은 n 개의 수 를 나타 내 며 각각 n 개의 물품 의 수량 을 나타 낸다.
 
Output
각 그룹의 데이터 출력 배열 수 에 대응 합 니 다.(어떠한 연산 도 2^31 의 범 위 를 초과 하지 않 습 니 다)
 
Sample Input

   
   
   
   
2 2 1 1

 
Sample Output

   
   
   
   
2

 
Author
xhd
 
Recommend
xhd
 
이 문 제 는 AB 와 BA 가 서로 다른 배열 조합 에 속 하기 때문에 일반적인 생 성 함 수 를 간단하게 사용 하지 말고 배열 조합 을 처리 할 수 있 는 지수 형 생 성 함 수 를 사용 해 야 한다.공식 과 원 리 는 전 재 된 황소 블 로그 이다.
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;

int n,m;
int num[10];
double a[100];
double b[100];

double fun(int s)
{
	int i;
	double sum=1;
	for(i=2;i<=s;i++)
		sum*=i;
	return sum;
}

void Generating_function()
{
	int i,j,k;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	a[0]=1;
	for(i=1;i<=n;i++)
	{
		for(j=0;j<=m;j++)
		{
			for(k=0;k<=num[i]&&k+j<=m;k++)
				b[k+j]+=a[j]*1.0/fun(k);
		}
		memcpy(a,b,sizeof(b));
		memset(b,0,sizeof(b));
	}
}

int main()
{
	int i;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=1;i<=n;i++)
			scanf("%d",&num[i]);
		Generating_function();

		printf("%0.lf
",a[m]*fun(m)); } return 0; }

좋은 웹페이지 즐겨찾기