Gravatar
雪狼
积分:662
提交:204 / 354
没想到高效的方法,只好开二进制分解了

Gravatar
雪狼
积分:662
提交:204 / 354
没想到高效的方法,只好开二进制分解了

Gravatar
cstdio
积分:4748
提交:1198 / 2108
为什么老是数组开小……智硬啊智硬

Gravatar
赵寒烨
积分:551
提交:231 / 463
基础的多重背包问题,用二进制的思想可以把时间优化到 $O(w×\sum \log m[i])$
核心代码如下:


procedure MultiplePack(cost,weight,amount:longint);
var
k:longint;
begin
if cost*amount>=w then
begin
CompletePack(cost,weight);
exit;
end;
k:=1;
while k<amount do begin
ZeroOnePack(k*cost,k*weight);
amount:=amount-k;
k:=k*2;
end;
ZeroOnePack(amount*cost,amount*weight);
end;
begin
for i:=1 to n do
begin
readln(weight[i],cost[i],m[i]);
MultiplePack(cost[i],weight[i],m[i]);
end;
end.


Gravatar
苏轼
积分:1509
提交:515 / 919
悲催的数据...

Gravatar
天下第一的吃货殿下
积分:234
提交:79 / 206
分别拆每个宝物为1,2,4,8。。。。个,分别组成一个物品,最后个数可能会有剩余值,易证明此时可以把剩余值直接当成一个背包,因为m减剩余值一定大于剩余值,而1~(m减剩余值)之间的数都可以得到。最后就是简单背包了。