我目前正在查询结果如此
A,B,C,D,E =项目
数字 =重量
E 88
use Algorithm::Bucketizer;
my $b = Algorithm::Bucketizer->new( bucketsize => 30);
for my $i (1..10) {
$b->add_item($i, 30+$i);
}
for my $bucket ($b->buckets()) {
for my $item ($bucket->items()) {
print "Bucket ", $bucket->serial(), ": Item $item\n";
}
print "\n";
}
http://search.cpan.org/~mschilli/Algorithm-Bucketizer-0.13/Bucketizer.pm
使用此模块我正在应用背包算法尝试将项目的权重分配到存储桶
my $bucketizer = Algorithm::Bucketizer->new(bucketsize => $size);
问题在于,当体重较大时,我正在搜索该体重的大小被排除在外。
示例:
bucketsize => 30
是否有其他算法可以解决这种情况?或者有没有办法修改这个不排除大于大小的权重?
是否可以将其调整为这样工作?
如果重量>尺寸然后只填充具有该重量的桶
答案 0 :(得分:3)
只需传递铲斗尺寸而不是铲斗尺寸上任何物品的实际尺寸。
use Algorithm::Bucketizer qw( );
use List::Util qw( min );
my @items = ...;
my $bucket_size = 30;
my $bzer = Algorithm::Bucketizer->new( bucketsize => $bucket_size );
for my $i (0..$#items) {
$bzer->add_item( $i => min($items[$i], $bucket_size) );
}
my @bucketed_items = map { [ $bucket->items() ] } $bzer->buckets();
或者,因为您知道超大值将占用整个存储桶,请将其过滤掉并将其添加回结果。
use Algorithm::Bucketizer qw( );
my @items = ...;
my $bucket_size = 30;
my $bzer = Algorithm::Bucketizer->new( bucketsize => $bucket_size );
my @bucketed_items;
for my $i (0..$#items) {
if ($items[$i] >= $bucket_size) {
push @bucketed_items, [ $i ];
} else {
$bzer->add_item( $i => $items[$i] );
}
}
push @bucketed_items, map { [ $bucket->items() ] } $bzer->buckets();
答案 1 :(得分:2)
我看不到你被困在哪里。您只需在现有算法中添加预处理步骤。你对权重进行一次传递。当您找到一个>= bucketsize
时,只需用一个重量填充一个桶即可。然后从问题集中移除该重量和铲斗,并照常继续。
在上面的示例中,您将从
开始bucket[0] = 88
weights = [15, 23, 10, 8]
继续使用常规解决方案,在返回后添加88公斤桶。