主要總結下快速冪的二進位制思想與dp中多重揹包的二進位制優化:
*1*.快速冪:
看下模板:
long long原理:將計算a的b次冪時普通的pow2(
int
a,
int
b )//求a的b次冪
return
r;
}
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...