排列組合(可重複版)
阿新 • • 發佈:2018-11-19
#include<iostream> #include <string> #include <string.h> #include<vector> #include<stack> #include<queue> #include<stdio.h> #include<stdlib.h> #include<iomanip> using namespace std; int count1 = 0; void print_permutation(int n, int* P, int* A, int cur) { if (cur == n) {//遞迴邊界 for (int i = 0; i < n; i++)printf("%d ", A[i]); count1++; printf("\n"); } else for (int i = 0; i < n; i++)if (!i||P[i]!=P[i-1]) {//下標不重複 int ok = 1; int c1 = 0, c2 = 0; for (int j = 0; j < cur; j++) if (A[j] == P[i])c1++;//計算P[i]在陣列A中出現了多少次 for (int j = 0; j < n; j++)if (P[i] == P[j])c2++;//計算P[i]在陣列P中出現了多少次 if (c1 < c2) { A[cur] = P[i]; print_permutation(n, P, A, cur + 1);//遞迴呼叫 } } } int main() { #ifdef LOCAL freopen("data.in", "r", stdin);//scanf freopen("data.out", "w", stdout);//printf #endif int A[10000]; int n; int P[10000]; while (cin >> n&&n) { for (int i = 0; i < n; i++)cin >> P[i]; count1=0; print_permutation(n,P, A, 0); cout << count1 << endl;//輸出有多少種組合 } system("pause"); return 0; }