**:
分析:n個人**總共可以抽到n的階乘種情況,要的到全部錯序的情況需要用總情況減去有人中獎情況的所有可能性,所以得到遞推公式:
這裡假設f(n)為當n個人時總共有幾種錯需排列情況。
c(n,x) = n * (n-1)*(n-2).....*(n- x+1) / x * (x-1)*(x-2).....*(1);
就是乙個數學表示式,不會列印所以用上面的形式表示了。
f(n) = c(n,1)f(n-1)- c(n,2)f(n-2)-c(n,3)f(n - 3) ...... - c(n,n-2)f(2) - 1;
得到**如下:
c**
#include
#include
int num[7];
int cnum(int top,int bottom)
for(i = top;i>top-bottom;i--)
return ntop / nbottom;
} int fib(int n)
if(num[n] != 0)
for(i = n;i>=1;i--)
bottom = n - 2;
for(i = 1;i<=bottom;i++)
return num[n] = sum - sumsub - 1;
} int main()
memset(num,0,7);
rate = fib(n)/(sum+0.0);
printf("%.2lf%%\n",rate*100);
}else
} } return 0;
}
由於當人數為7個或以上是概率趨於穩定值,所以這裡就不用計算了,直接輸出。
另外,看了下別人的**覺得這個分析很好,如下:
n張票的所有排列可能自然是ann = n!種排列方式
現在的問題就是n張票的錯排方式有幾種。
首先我們考慮,如果前面n-1個人拿的都不是自己的票,即前n-1個人滿足錯排,現在又來了乙個人,他手裡拿的是自己的票。
只要他把自己的票與其他n-1個人中的任意乙個交換,就可以滿足n個人的錯排。這時有n-1種方法。
另外,我們考慮,如果前n-1個人不滿足錯排,而第n個人把自己的票與其中乙個人交換後恰好滿足錯排。
這種情況發生在原先n-1人中,n-2個人滿足錯排,有且僅有乙個人拿的是自己的票,而第n個人恰好與他做了交換,這時候就滿足了錯排。
因為前n-1個人中,每個人都有機會拿著自己的票。所以有n-1種交換的可能。
綜上所述:f(n) = (i - 1) * [f(n - 1) + f(n - 2)]
c**
#include
#include
int main(void)
,,,};
for (i = 4; i
scanf("%d", &n);
while (n-- && scanf("%d", &i))
printf("%.2f%%\n", d[i][1]*100.0/d[i][0]);
return 0;
}
錯排問題 hdu2048
錯排問題 問題 十本不同的書放在書架上。現重新擺放,使每本書都不在原來放的位置。有幾種擺法?這個問題推廣一下,就是錯排問題,是組合數學中的問題之一。考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排。n個元素的錯排數記為d n 研究乙個排列錯...
HDU 2048 錯排公式
n n 個人全沒有中獎的概率 發生這種情況的所有可能性 情況總數 我們來想一想全部錯排該怎麼求。假設前n 1 role presentation n 1 n 1個人都完成了錯排,那麼第 n n 個人可以和這n 1 role presentation n 1 n 1個人任意乙個互換,那麼就完成了全部錯...
錯排問題 hdu2048
n個有序的元素有n 種排列方式,如果乙個排列使得所有元素都不在原來的位置上的排列就叫錯排。1 錯排有兩種方法進行計算,一種是基於容斥定理最後得出來的乙個階乘的計算式,計算機對於階乘非常的不友好,因此第一種很少使用。2 由於階乘的原因,我們不得不再尋找一種計算錯排dn的方法。首先我們以1,2,3,4的...