二进制优化:
将第i种物品拆分成若干件物品,每个物品有一个系数,1, 2, 4, 8… 2k-1, n-2k+1,
假设有一种大米只有M袋 例如M为100 利用二进制来分解
for(int j=1;j<=a[i].num;j<<=1){
//左移一位等价于乘以 2
weigh[coun]=j*a[i].weight;
size[coun++]=j*a[i].value;
a[i].num-=j;
}
当a[i].num不为0的时候就
weigh[coun]=a[i].numa[i].weight;
size[coun++]=a[i].numa[i].value;
100=1+2+4+8+16+32+37
本来正常的思路是把100弄成100个1 即100个只能使用一次的物品 但是现在把100弄成1+2+4+8+16+32+37 7个数可以组合成100以内的任意一个数 所以可以这样拆分 把每一个背包都拆成一个集合之后 在进行01背包的处理
心得体会:
这周继续学习了背包问题,对于背包问题在01背包的基础上学习了,完全背包,多重背包,其中完全背包多重背包都可以用二进制优化转换成01背包问题。