hdu2844 不完全揹包 二進位制壓縮

2022-08-17 07:24:18 字數 1105 閱讀 9114

題意:告訴你n種硬幣的面值和數量,可以在1~m中合成出多少中**

題解:***幾乎所有部落格都是說二進位制方式解決,但是很少有人看得懂**,因為不知道二進位制壓縮在這裡的意義

二進位制壓縮在這裡你只要抓住  1   2    4    8    16    32    ....    2^n    這些數字可以合成  1到2^(n-1)-1中任何數字,

也就是說,在0的基礎上用1可以得到0+1=1,然後繼續用2可以得到0+2=2和1+2=3,再繼續用4可以得到0+4=4和

1+4=5和2+4=6,3+4=4.........這些合成的數字都是正好到下乙個2^n的前面乙個數字即2^n-1,所以這種做法可以省去

一部分用來參與for迴圈的數字,最簡單的例子,硬幣數是x則需要for(i=1;i<=x;i++)乙個乙個方案遍歷,

現在可以for(i=1;i<=x;i*=2)在疊加效果上可以省去i=(3,5,6,7,9....)這些過程

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10

using

namespace

std;

1112

int a[110], c[110], dp[1000010

];13

intmain()

1429

else

3036

for(int k = m; k >= a[i] * c[i]; k--)//

c[i]已經變了

37 dp[k] = max(dp[k], dp[k - a[i] * c[i]] + a[i] *c[i]);38}

39}40int sum = 0;41

for(int i = 1; i <= m; i++)

42if(dp[i] ==i)

43 sum++;

44 printf("

%d\n

", sum);45}

46return0;

47 }

HDU2844 揹包問題(二進位制優化)

題意 n,m給出a1,a2,a3.an c1,c2,c3.cn 給出硬幣的價值和個數,問在1 m中間能構造出多少個組合 思路 n種物品的價值,n種物品的個數 一種物品能組成多種物品的0 1揹包 includeusing namespace std const int n 1e2 10 const i...

HDU2844 揹包問題(二進位制優化)

題意 n,m給出a1,a2,a3.an c1,c2,c3.cn 給出硬幣的價值和個數,問在1 m中間能構造出多少個組合 思路 n種物品的價值,n種物品的個數 一種物品能組成多種物品的0 1揹包 includeusing namespace std const int n 1e2 10 const i...

HDU 2844 Coins 揹包 二進位制拆分

題意 有n n 100 枚硬幣面值為a1,a2,an,數量分別為c1,c2,cn,求能組成多少種小於m的數額 m 100000 思路 不能暴力,對於ai ci m的情況,直接完全揹包。剩下的二進位制拆分ci,將ci 拆分為 20 21 2k 1 ci 2k 1 1 對於每一項進行零一揹包即可。inc...