Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 背包重量>最大尺寸_Algorithm_Perl_Knapsack Problem - Fatal编程技术网

Algorithm 背包重量>最大尺寸

Algorithm 背包重量>最大尺寸,algorithm,perl,knapsack-problem,Algorithm,Perl,Knapsack Problem,我目前有一个这样的查询结果 A、 B、C、D、E=项目 数字=重量 A 15 B 23 C10 D 8 E 88 使用此模块,我将应用背包算法尝试将项目的权重分配到桶中 my $bucketizer = Algorithm::Bucketizer->new(bucketsize => $size); 问题是,当重量较大时,我搜索的重量大小被排除在外 例如: bucketsize=>30 E 88这将被排除在外 有没有其他算法可以解决这种情况?或者有没有一种方法可以修改这个,不排除大

我目前有一个这样的查询结果

A、 B、C、D、E=项目

数字=重量

A 15 B 23 C10 D 8 E 88

使用此模块,我将应用背包算法尝试将项目的权重分配到桶中

my $bucketizer = Algorithm::Bucketizer->new(bucketsize => $size);
问题是,当重量较大时,我搜索的重量大小被排除在外

例如:

bucketsize=>30

E 88这将被排除在外 有没有其他算法可以解决这种情况?或者有没有一种方法可以修改这个,不排除大于尺寸的重量

有没有可能把它调整成这样


如果重量>大小,那么只在桶里装满这个重量

我看不出你被卡住了。您只需向现有算法添加一个预处理步骤。你单次通过了重量。当您找到一个>=bucketsize时,只需将该重量装满一个桶即可。然后从问题集中删除该重量和铲斗,并像往常一样继续

在上面的示例中,您将从

bucket[0] = 88
weights = [15, 23, 10, 8]

继续你通常的解决方案,在你回来后再加上88公斤的桶。

我看不出你在哪里卡住了。您只需向现有算法添加一个预处理步骤。你单次通过了重量。当您找到一个>=bucketsize时,只需将该重量装满一个桶即可。然后从问题集中删除该重量和铲斗,并像往常一样继续

在上面的示例中,您将从

bucket[0] = 88
weights = [15, 23, 10, 8]

继续使用通常的解决方案,在返回后附加88 kg的桶。

只需传递桶大小,而不是超过桶大小的任何项目的实际大小

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();

只需传递桶大小,而不是超过桶大小的任何项目的实际大小

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();

这个问题令人困惑。也许我缺少背景资料。您想要什么输出?很抱歉造成混淆,我试图不排除大于桶大小的重量。如果重量大于bucketsize,则不包括该重量。我试着不排除那个重量,只是用那个重量装满一个桶,这没有用。我仍然不知道你想要什么样的输出。你想解决什么问题?这很像一个XY问题:提示:避免使用$b来避免与sort和类似Sub的冲突。这个问题令人困惑。也许我缺少背景资料。您想要什么输出?很抱歉造成混淆,我试图不排除大于桶大小的重量。如果重量大于bucketsize,则不包括该重量。我试着不排除那个重量,只是用那个重量装满一个桶,这没有用。我仍然不知道你想要什么样的输出。你想解决什么问题?这很像一个XY问题:提示:避免使用$b来避免与sort和类似Sub的冲突。第二个解决方案与Prune的相同。第二个解决方案与Prune的相同。