Algorithm 背包重量>最大尺寸
我目前有一个这样的查询结果 A、 B、C、D、E=项目 数字=重量 A 15 B 23 C10 D 8 E 88 使用此模块,我将应用背包算法尝试将项目的权重分配到桶中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这将被排除在外 有没有其他算法可以解决这种情况?或者有没有一种方法可以修改这个,不排除大
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的相同。