ABCDE,五個人,已按順序排好,現在重新排隊,要求每個人都不排到原來的位置上,問有多少種排法?


 1 package acknowledge;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * ABCDE,五個人,已按順序排好,現在重新排隊,要求每個人都不排到原來的位置上,問有多少種排法
 7  * 
 8  * @author HHY 擴展:有N個人排隊,現在重新排隊,每個人都不排到原來的位置上,問有多少中排法? 
 9  * 用 f(n) 表示n個人有多少種排法 理解思路:
10  *     1. 已知f(1) = 0, f(2) = 1 
11  *     2. n = 3 時,不做限制有 3! 種排法 
12  *         1個人站在原位,有 C(3,1) * f(2) 種排法
13  *         2個人站在原位,有 1 種排法 則 f(3) = 3! - C(3,1)*f(2) - 1 
14  *     3. n = 4時,不做限制有 4! 種排法 
15  *         1個人站在原位,有 C(4,1) * f(3) 種排法 
16  *         2個人站在原位,有 C(4,2) * f(2)種排法 
17  *         3個人站在原位,有 1 種排法 
18  *         則 f(4) = 4! - C(4,1) * f(3) - C(4,2) * f(2) - 1
19  *     4. n = k 時,不做限制有 k! 種排法 1個人站在原位,有 C(k,1) * f(k-1) 種排法 
20  *            2個人站在原位,有 C(k,2) * f(k-2) 種排法 
21  *            。。。 
22  *         k-1個人站在原位,有 1 種排法 
23  *         則 f(k) = k! - C(k,1) * f(k-1) - ... - C(k, k-2) * f(2) -1
24  */
25 public class GetNoRepeatSort {
26 
27     /**
28      * 求n的階乘
29      * 
30      * @param n
31      * @return
32      */
33     public static int getMultiN(int n) {
34         int k = n;
35         for (int i = n - 1; i > 0; i--) {
36             k *= i;
37         }
38         return k;
39     }
40 
41     /**
42      * 求C(n,k) = n! / k!(n-k)!
43      * 
44      * @param n
45      * @param k
46      * @return
47      */
48     public static int getC(int n, int k) {
49         int mulN = getMultiN(n);
50         int mulk = getMultiN(k);
51         int mul = getMultiN(n - k);
52         return mulN / (mulk * mul);
53     }
54 
55     /**
56      * f(n) = n! - C(n,1) * f(n-1) - ... - C(n,k) * f(n-k) - ... - C(n,n-2)*f(2) - 1
57      * 
58      * @param n
59      * @return
60      */
61     public static int getSortNum(int n) {
62         if (n <= 1)
63             return 0;
64         if (n == 2)
65             return 1;
66         int sub = 1;
67         for (int k = 1; k <= n-2; k++) {
68             sub += getC(n, k) * getSortNum(n - k);
69         }
70         return getMultiN(n) - sub;
71     }
72 
73     public static void main(String[] args) {
74         System.out.println("Input a integer:");
75         Scanner sc = new Scanner(System.in);
76 
77         int n = sc.nextInt();
78         System.out.println("SortNum: " + getSortNum(n));
79     }
80 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM