對二進位制優化的一些理解 (後續完善 )

2021-09-30 12:00:03 字數 1164 閱讀 8753

主要總結下快速冪的二進位制思想與dp中多重揹包的二進位制優化:

*1*.快速冪:

看下模板:

long longpow2(inta,intb )//求a的b次冪

returnr;

}

原理:將計算a的b次冪時普通的

b次迴圈,改為了按照b對應的二進位制數每一位的權值及該位上是0或1,從而判斷是否需要乘上該位時二進位制對應的權值次方。

舉個例子。對於求a的21次方(不要管為什麼是21),10進製的21對應的二進位制數為10101,這時候程式會一邊計算21所對應的某一位二進位制數,如果是1便讓結果r乘上當前的二進位制位的權值(即乘上a的n次方)然後權值base平方得到二進位制下一位的權值。

其實我很佩服我是怎麼糾結著寫到這裡的。。。目前就理解到這裡了。

*2*dp多重揹包:

同樣先放模板:

int dp()

else//否則先多重再o1

for(int c=c;c>=amount*w[i];c--)

f[c]=max(f[c],f[c-amount*w[i]]+amount*v[i]);//01揹包加上剩下的來算最優值}}

return f[c]

;

首先描述下多重揹包的寫法:

1)對於每一種物件,如果其數量足夠多以致於整個揹包全放這一種物件都不夠,那麼對該物件做一遍完全揹包即可;

2)而如果當某物件的件數*單件體積小於揹包體積的話,那麼我們就需要思考,到底放幾個該物件才最優?而這也是此時的dp轉移思路,即列舉放n個該物件進揹包的最優值(n≥1並且n≤該物件的件數),即做n遍01揹包。

所以在第二步中就出現可以優化的地方了,既然逐個列舉選物件的個數,那麼這就產生了重複列舉的弊端。這很顯然,比如選擇4件該物件的最優值就已經被選1件和選3件時的方案找到過了。

因此在這裡根據二進位制的特點我們只需要做

小於該物件總件數的2的次冪

,並且最後再把餘下的物件個數當做剩下的乙個做一遍01揹包即可。這裡將本來的o(件數*揹包體積)減小到(log2件數*揹包體積)。

二進位制的一些操作

1 二進位制與十進位制互轉 十進位制轉二進位制 例子 13 1101 13 2 6餘1 6 2 3餘0 3 2 1餘1 1 2 0餘1 那麼13用二進位制表示為 1101 倒序排列餘數 不足的用0補齊 00001101 二進位制轉十進位制 例子 1101 13 可以在c 裡面宣告為 int num ...

關於二進位制的一些總結

5 00000000 00000000 00000000 00000101 原碼 乙個整數,按照絕對值大小轉換成的二進位制數 反碼 將二進位制數按位取反,所得的新二進位制數稱為原二進位制數的反碼 補碼 反碼加1稱為補碼 5 原碼 00000000 00000000 00000000 00000101...

二進位制補碼的一些思考

最近都一直在看幾本關於計算機組成原理方面的大作 code the hidden language of computer hardware and software computer system a programer perspective introduction to computer sy...