面試題描述:一個射擊運動員打靶,靶一共有10環,連開10槍打中90環的可能行有多少種?
網上已經有很多解法了,不過這裡擴充到一般的角度分析。
抽象出來的數學描述就是:從M個數中取出N個數,使得和正好等於給定的值,求所有的取法。
C++實現:
//從M個數中取出N個數,使得和正好等於total,求所有的取法<br />int result[1024];//結果記錄<br />int count = 0;//結果計數<br />int total = 90;//指定的和<br />int M = 11;<br />int N = 10;<br />//從m個數中取出n個數,使得和正好等於t,其中a是已按遞增排序的正整數數組<br />void f(int a[], int m, int n, int t)<br />{<br />if(NULL==a || n<0 || t<0 || m<=0 || a[m-1]*n<t)<br />{<br />return;<br />}<br />if(1==n)//成功並列印<br />{<br />result[n-1] = t;<br />for(int i=0; i<N; i++)<br />{<br />printf("%d ", result[i]);<br />}<br />printf("/r/n");<br />count++;//計數<br />return;<br />}<br />//i從a[0](最小)迴圈到t<br />for(int i=a[0]; i<=t; i++)<br />{<br />result[n-1] = i;<br />f(a, m, n-1, t-i);//遞迴<br />}<br />}<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br />int a[11];<br />for(int i=0; i<11; i++)<br />{<br />a[i] = i;<br />}<br />f(a, M, N, total);<br />printf("total count: %d/r/n", count);<br />return 0;<br />}