最近心情比較鬱悶,然後我其實在演算法方面是絕對的短腳,所以也得累積一下,那麼這此就來寫乙個關於演算法類的好了
當然也是網上看到了部落格然後進行思考理解的,不是我自己想出來的,理解了之後也算是大有收穫,開闊思路
題目:把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)5,1,1和1,5,1 是同一種分法。
那麼首先我們就是要進行分析了,這個分法我們要如何去分塊,這裡的話其實一般來說就四種情況
(1)m==0或m==1這種時候不管有多少個盤子,我們永遠只有一種放法,這種的前提是不能有蘋果留在手裡不放
(2)n==1這種時候不管有多少個蘋果,都只能放在乙個盤子裡,也是只有一種放法,當然,n==0時也一樣
(3)m>=n這種時候是我們需要主要計算有多少種分法的一種情況
(4)m這種時候也是我們主要需要分析的一種情況
首先是(3)這種分法,此時蘋果m多於等於盤子n,那麼這種情況下可以思考到
這種分法時,主要分兩塊
1、所有的盤子都有蘋果即:f(m,n) = f(m-n,n)
這個等式的得到實際上就是,如果每個盤子都有蘋果,那麼實際上把每個盤子都減去乙個蘋果時得到的分配方法數量是一樣的,那就是跟蘋果數量減去盤子數量後分配的次數是一樣的,即:
f(m,n) = f(m-n,n)
2、乙個以及以上盤子空著的情況:f(m,n) = f(m,n-1)
這個等式可能很多人會覺得不理解,其實我自己也是沒有馬上就理解,這裡首先要對f(m,n)這個方法有個準確的定義,這個方法的結果就是我們想要的分配的總數結果,只是現在是未知數而已,所以其實現在這個f(m,n-1)的答案就是當少乙個盤子時的分配的數量,即:
f(m,n) = f(m,n-1)
然而,上面兩個等式都是限制了情況底下才會相等,如果將上面兩塊拼起來,那就是完整的f(m,n)了,故得出
f(m,n) = f(m-n,n) + f(m,n-1)
答案 = 每個盤子都有蘋果的分配數量 + 至少乙個盤子空著的分配數量
其次是(4)這種情況:此時蘋果少於盤子,那麼這種情況下可以思考到:
1、由於5,1,1和1,5,1 是同一種分法,所以其實:f(m,n) = f(m,m)
這種情況下就比較簡單了,當蘋果數量少於盤子數量,那麼和蘋果的數量和盤子的數量一樣多時的結果是一樣的,即:
f(m,n) = f(m,m)
那麼當情況都區分出來之後,就得到了:
static
intfun(
intm,
intn)
// m個蘋果放在n個盤子中共有幾種方法
通過這個方法,就可以得到正確的結果了,我本地也已經進行測試驗證過了,其實這個方法的資料,最後都是到了m==0 || n == 1得到的數字1層層遞迴上去
而得到最終結果的,我本身也在**中進行了輸出驗證過了,在這裡就不將輸出放出了
累積失敗檢測演算法
在分布式系統中經常使用心跳 heartbeat 來檢測server的健康狀況,但從理論上來說,心跳無法真正檢測對方是否crash,主要困難在於無法真正區別對方是宕機還是 慢 傳統的檢測方法是設定乙個超時時間t,只要在t之內沒有接收到對方的心跳包便認為對方宕機,方法簡單粗暴,但使用廣泛。1.傳統錯誤檢...
演算法總結與思考(一)
先看乙個問題 給定乙個陣列和乙個值,刪除該值的所有指定值並返回新長度。例如 有陣列 3,2,2,3,4,5,3 刪除陣列中所有的2,返回刪除後陣列的長度。詳情見leetcode27號問題。解決思路 定義k 0為新陣列長度,遍歷陣列所有值判斷如果與指定值不相等,則將值賦給陣列num k 並且k js ...
聚類演算法(一)
1.使用 kmeans演算法 k均值演算法是一種常用的聚類分析演算法。該演算法接受輸入值k,然後將n個資料物件劃分為k個簇,使得獲得的簇滿足如下條件 同一簇中的物件相似度較高,而不同簇中的物件相似度較小。kmeans演算法使用k均值演算法,簇的數量是由乙個引數指定,使用者可以選擇歐氏距離或曼哈頓距離...