一道演算法面試題的分析

來源:互聯網
上載者:User

面試題描述:一個射擊運動員打靶,靶一共有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 />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.