動態規劃 二進位制揹包 多重揹包

2021-10-05 09:32:53 字數 1254 閱讀 6995

之前有過一篇多重揹包判斷是否能湊乙個整數的問題->傳送門

如果我們不是判斷是否能湊成這個數,而是計算這個數內的揹包最大值,就不能用這個寫法了(也可能是我太菜了,一直wa)

於是就有了二進位制揹包的方式

在多重揹包中如果每個揹包被選擇的次數maxi都比較小

我們可以把他拆違maxi個相同的揹包

但如果maxi可能比較大,那麼最後的揹包總數就可能會超時

怎麼把這個maxi用一些更小的數字來組合而成呢?

我們都知道,任意乙個正整數都能被表示為二進位制之和,而2的0次方即1可以表示任意乙個數,所以如果在多重揹包問題中我們知道每個揹包能選擇的最大次數maxi,我們就可以把maxi分解為二進位制,把其中某些二進位制數加起來就能得到小於等於maxi的任意乙個數。

如果沒有理解,我們就看這個例子

example:

我們有個揹包最多能被選擇40次,也就是我們可以選擇0到40次這個揹包,而40=1+2+4+8+16+9,1、2、4、8、16、9這幾個數就可以構成1到40中的任意乙個數,我們如果不選擇這個揹包就是0。(!!!注意:一定是從2的0次方開始遞增分解)

p1833

#include

using

namespace std;

int ans[

1005];

//all可能會很多,所以不能用二維的揹包

int t[

10005];

int score[

10005];

int c[

10005];

int a[

1000005];

int b[

1000005];

int all=0;

int n;

void

transf()

//轉化揹包}}

}int

main()

transf()

;if(h2h2+=24

;int t=

(h2*

60+m2)

-(h1*

60+m1)

;for

(int i=

1;i<=all;i++)}

cout << ans[t]

<< endl ;

return0;

}

演算法 動態規劃 多重揹包 二進位制優化

name 多重揹包 二進位制優化 dp actor ht time 2015年11月2日 error reporte include include include include include include include include include define n 10010 usin...

多重揹包二進位制優化

多重揹包二進位制優化 將價值數量相同的物品分成1,2,4,8.因為100以內任何數都可以由幾個2的n次方數組成。所以,有遍歷沒乙個數變為遍歷每乙個2的n次方數。例題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相...

多重揹包(二進位制優化)

馬上就要輕院校賽了,沒時間了,下面是網上找的多重揹包,感覺很好 void zeroonepack int cost,int weight,int n void completepack int cost,int weight,int n void multipack int c,int w,int ...