LeetCode(動(dòng)態(tài)規(guī)劃):464. 我能贏嗎

關(guān)于本題中的位運(yùn)算
public boolean f(int maxChoosableInteger, int desiredTotal, int choos) { ????if (desiredTotal <= 0) { ??????return false; ???} ????if (dp.containsKey(choos)) { ??????return dp.get(choos); ???} ????for (int i = 1;i <= maxChoosableInteger;i++) { ??????if ((choos & (1 << i)) == 0) { ????????if (!f(maxChoosableInteger,desiredTotal-i,choos | (1 << i))) { ??????????dp.put(choos,true); ??????????return true; ???????} ?????} ???} ????dp.put(choos,false); ????return false; ?}
怎么理解這個(gè)?
choos & (1 << i)) == 0?// 判斷i是否被拿 choos | (1 << i) // 將第i位bit位標(biāo)為1 // 舉個(gè)例子 ??//假如整數(shù)池是這樣 ? ?1?2?3?4?5?6?7?8?9?10 ??// 最開(kāi)始打算用一個(gè)一維數(shù)組表示 可以這樣 value : 0?0?0?0?0?0?0?0?0?0?0 -> int[] index : 0?1?2?3?4?5?6?7?8?9?10? ??// 由于線性結(jié)構(gòu)對(duì)于改動(dòng)態(tài)規(guī)劃來(lái)說(shuō)復(fù)雜度較高,所有將參數(shù)int[]降維成int類(lèi)型 ??// 利用int32個(gè)bit位表達(dá)信息 那么可以這樣 ? 0?0?0?0?0?0?0?0?0?0?0 -> int ??// 此時(shí)我們將0視為未拿 1視為已拿 ??// 如果 9被拿了那么從右往左以0位置起始就是第9位bit位標(biāo)為1 ? 0?1?0?0?0?0?0?0?0?0?0 -> int ??// 假如10已經(jīng)被拿了但是此時(shí)想拿9怎么標(biāo) 將 1左移9位并且與choos做或運(yùn)算 也就是這種表達(dá):choos | (1 << 9) ??// 由于 : 0 | 0 = 0; 0 | 1 = 1; 1 | 1 = 1; choos:?1?0?0?0?0?0?0?0?0?0?0 -> int help:?0?1?0?0?0?0?0?0?0?0?0 -> int ans:??1?1?0?0?0?0?0?0?0?0?0 -> int ??// 假如10,9,7,1都被拿了如何判斷9是否被拿 可以利用1左移9位并且與choos做與運(yùn)算也就是這種表達(dá):choos & (1 << 9) ??// 如果 ans != 0; 說(shuō)明9已經(jīng)被拿了 ??// 由于 : 0 & 0 = 0; 0 & 1 = 0; 1 & 1 = 1; choos:?1?1?0?1?0?0?0?0?0?1?0 -> int help:?0?1?0?0?0?0?0?0?0?0?0 -> int ans:??0?1?0?0?0?0?0?0?0?0?0 -> int
標(biāo)簽: