質問:チケットの[]キューアップ

タイトル説明を
再生するには、公園へのMの子供があり、チケットは$ 1です。前記子バンドのお金N $ 1、$ 2のお金でK子。導体は、変更これらの子供たちの多くは、常に変化を探し導体開いていた合計を並べる方法を求めていませんでした。注:二人の子供は、元の変更を取り、自分の位置を入れ替え、新しい行の方法が考えられます。(M <= 10)

エントリー

入力ライン、M、N、K(M = N + K、M <= 10)。

輸出

出力ライン、合計キューイングスキーム。

サンプル入力

4 2 2

サンプル出力

8

まず、私たちが知っていることができます:
1.を保持$ 1以下の子供は子供の数が$ 2開催カウントであれば、それは確かではありません何の解決されます。

2.時にM == 0の場合は、すなわち、チケットを購入する誰もが、ではない解決策の。

3:K(肯定可解性)従って、のみ議論N> =
計算の多数、規則介して紙を与えるように要約することができます。

考慮に入れずに(2人の子供たちは、元の変更を取得し、その位置を入れ替え、新しい行の方法が考えられる。場合は)この場合、我々は再帰的で配置された結果の結果を得ることができます。

しかし、問題は(!すなわちN!そしてK)彼の完全な配列を、K、我々はその後、Nを計算している、そのような状況を考慮することが私たちを必要とし、その結果を掛けました。

最終結果は、(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