題目思路:
其實我還真沒怎麼看出來這個是遞推(嚶嚶自己好菜哇)……不過很清楚的是我們需要求出每個人拿到的都不是自己的牌子的情況有幾種,按照日常經驗,如果前n個人已經做到了錯排(也就是拿的都不是自己的牌子),當第n+1個人來的時候,他跟任意一個人交換後就能做到這n+1個人都實現錯排,!!但是注意還有一種情況,就是前n個人並沒有實現完全錯排,有一個人拿的牌子是正確的,這時第n+1個人來了之後,他只要跟這個拿對了牌子的人交換也可以做到n+1個人錯排,這時可以看作是n-2個人實現了錯排;
所以綜上,遞推式就可以出來了:
f [ i ] = ( f [ i - 2 ] + f [ i - 1 ] ) * ( i - 1 ) ;
————————————————
參考連結:https://blog.csdn.net/destiny1507/article/details/81229565
import java.text.DecimalFormat; import java.util.Scanner; public class hdu2048 { public static long jc(int xx) { long yy = 1; if (xx==0) { return 1; } for (int i = 1; i <= xx; i++) { yy *= i; } return yy; } public static void main(String[] args) { // TODO 自動生成的方法存根 long[] aa = new long[21]; aa[1] = 0; aa[2] = 1; DecimalFormat df = new DecimalFormat("#.00"); for (int i = 3; i < aa.length; i++) { aa[i] =(i-1)*(aa[i-1]+aa[i-2]); } Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for (int i = 0; i < n; i++) { int x = sc.nextInt(); System.out.println(df.format(aa[x]*100.0/jc(x))+"%"); } sc.close(); } }