我现在有一个查询,结果如下
A、B、C、D、E=项目
数字=重量
十五
B 23岁
C 10级
第8天
东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
使用此模块,我将应用背包算法,尝试将项目的权重分配给bucket
my $bucketizer = Algorithm::Bucketizer->new(bucketsize => $size);
问题是,当权重较大时,我正在搜索的权重大小将被排除在外。
例子:
bucketsize=>30个
E 88这将被排除在外
还有其他算法可以解决这种情况吗?或者有没有办法修改这个,不排除重量大于大小?
有没有可能调整成这样?
如果重量大于尺寸,则仅用该重量装满一个桶
最佳答案
只要传递bucket大小,而不是超过bucket大小的任何项目的实际大小。
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();
或者,因为您知道过大的值将占用整个bucket,所以将它们过滤掉并将它们添加回结果中。
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();
关于algorithm - 背包重量>最大尺寸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49136294/