題意:告訴你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 #include8 #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...