질문 : [] 티켓 대기열

제목 설명
재생 공원에 M 아이가, 티켓은 $ 1입니다. 상기 아이 밴드 돈 N $ 1, $ 2 돈을 K 아이입니다. 도체는 변경이 아이들의 대부분은 항상 변화를 찾고 도체 열려 총을 줄 방법을 물어 보지 않았다. 참고 : 두 아이, 자신의 위치를 교환하는 위안 변화를 가지고는 새 행 방법으로 간주 될 수있다. (M <= 10)

기입

입력 라인, M, N, K (여기서, M = N + K, M <= 10).

수출

출력 라인, 총 큐잉 방식.

샘플 입력

4 2

샘플 출력

8

첫째, 우리는 알 수 있습니다 :
1. 개최 덜 $ 1 개 어린이는 어린이의 수는 $ 2 보유 수보다 다음이 확실히입니다 경우 해결책이 없다.

2. M == 0, 즉 아무도 티켓을 구입하지시기 경우없는 해결책 중.

3. 따라서, 단지 논의는 N> = K (긍정 해결의 가능성) :는
계산을 통해 다수의 논문은 규칙 수득 요약 될 수있다 :

을 고려하지 않고 ( 두 아이, 위안화 변화를 얻을 자신의 위치를 교환, 새 행 방법으로 간주 될 수있다. 경우)이 경우, 우리는 재귀 적으로 배열 된 결과 결과를 얻을 수 있습니다.

그러나 문제는 (즉, N! 그리고 K가!), 그리고 결과 곱한 우리가 그의 전체 배열을, N을 계산 K 그 상황을 고려 우리를 필요로한다.

최종 결과 ( ! X N! X K 결과 )에 직접 출력한다.

다음과 같이 코드입니다 :

#include<iostream>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>

using namespace std;
int paixu_num = 0;

void getNUM(int remain_N, int remain_K, int linQian) {//remain_N  持有1元的数   remain_K  持有2元的数   linQian  1元零钱数
	if (remain_N == 0 || remain_K == 0) {//其中一个为零后,剩余那种直接摆在末尾就行了
		paixu_num++;
		return;
	}
	else if (linQian > 0) {
		getNUM(remain_N - 1, remain_K, linQian + 1);
		getNUM(remain_N, remain_K - 1, linQian - 1);
	}
	else {//零钱没有了,只能先让1元的孩子买票,使得售票员获得零钱
		getNUM(remain_N - 1, remain_K, linQian + 1);
	}
}
int pl(int n) {//得到n的阶乘
	int num = 1;
	for (int i = 1; i <= n; i++) {
		num *= i;
	}
	return num;
}
int main() {
	int M, N, K;		//N-1,K-2,M = N+K<=10
	cin >> M >> N >> K;
	if (N < K || M == 0) {// 两种无解的情况  要先排除
		cout << 0;
	}
	else {//因为上面排除N<K的情况了,所以肯定有解
		getNUM(N, K, 0);
		cout << paixu_num * pl(N) * pl(K);
	}
	return 0;

}




게시 35 개 원래 기사 · 원의 칭찬 0 · 조회수 650

추천

출처blog.csdn.net/enjoy_code_/article/details/104501067