哈夫曼編碼問題(切金條)

2021-10-09 19:01:53 字數 1008 閱讀 5308

一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如長度位20的金條,不管切成長度多大的兩半,都要花費20個銅板。一群人想分整塊金條,怎麼分最省銅板?

例如,給定陣列,代表一共三個人,整塊金條長度位10+20+30=60。金條要分成10,20,30三個部分。如果,先把長度60的金條分成10和50,花費60 再把長度50的金條分成20和30,花費50 一共花費110銅板。

但是如果,先把長度60的金條分成30和30,花費60 再把30的金條分成10和20,花費30,一共花費90銅板。

輸入乙個陣列,返回分割的最小代價。

先說哈夫曼編碼問題是什麼,

乙個非葉節點的兩個子節點合併的代價是兩個結點加起來的和,

比如說現在有三個節點分別是10、20、30

把10和20合併為30的代價也是30,然後把非葉節點加起來,就是哈夫曼編碼的代價,

假設我現在有一組數,先建立乙個小根堆

拿出最小的兩個數,1和1合,合成2,然後把2放回小根堆,代價是2,堆裡的數變成然後再在小根堆裡拿兩個最小的,是2 和2,合成4,然後扔回小根堆,堆裡的數變成,然後再合最小的兩個節點,2和4合成7,丟回小根堆,變成,然後繼續合,最後變成32,停,最後的代價就是每次合的時候產生的代價加起來。

這道題我們切割的順序,其實就是把這樣的過程反過來

class

lessmoney

return sum;

}void

main

(string args)

; vector<

int>arr;

for(

int i=

0;i<

4;i++

) cout<<

lessmoney

(arr);}

};

哈夫曼編碼問題

輸入乙個整數n,n 100,下面n行分別為n個字元及其出現頻率 輸出所有字元的頻率與其編碼長度的乘積之和 輸入 5 a 35 b 10 c 20 d 20 15 輸出 225輸入 3 x 20 y 50 z 5輸出 100整體思路 class node node 注意點 void printf in...

哈夫曼編碼問題

1 介紹 在計算機資料處理中,哈夫曼編碼使用變長編碼表對源符號 如檔案中的乙個字母 進行編碼,其中變長編碼表是通過一種評估 符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度 期望值降低,從而達到無失真壓縮資料的目的。例如,在英...

哈夫曼編碼問題

給定乙個數字n,代表有n種不同的字元,已知每種字元的出現次數,現在要求你設計一種編碼,使得任意乙個編碼都不是另外乙個編碼的字首,並且使得這些字元經過編碼壓縮之後的總長度最小 乙個數字n 代表有多少種不同的字元 0 n 1000 n個數字 每個數字代表一種字元的出現次數 乙個數字,代表總的編碼長度 5...