我现在有一个查询,结果如下
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/

10-11 00:58