什麼其他人說的是真的:
這個問題是NP完全問題。簡單的減少是通常的子集和。只有在聯合(-B)的非空子集合爲零時,才能通過注意到A的一個子集與B的子集(不是都爲空)進行顯示。
此問題僅弱NP完全,因爲它是多項式在數字參與的規模,但推測是在其對數指數。這意味着這個問題比名詞「NP-complete」所暗示的更容易。
您應該使用動態編程。
那麼我對這個討論有什麼貢獻?那麼,代碼(在Perl):
@a = qw(4 5 9 10 1);
@b = qw(21 7 -4 180);
%a = sums(@a);
%b = sums(@b);
for $m (keys %a) {
next unless exists $b{$m};
next if $m == 0 and (@{$a{0}} == 0 or @{$b{0}} == 0);
print "sum(@{$a{$m}}) = sum(@{$b{$m}})\n";
}
sub sums {
my(@a) = @_;
my($a, %a, %b);
%a = (0 => []);
while(@a) {
%b = %a;
$a = shift @a;
for my $m (keys %a) {
$b{$m+$a} = [@{$a{$m}},$a];
}
%a = %b;
}
return %a;
}
它打印
sum(4 5 9 10) = sum(21 7)
sum(4 9 10 1) = sum(21 7 -4)
所以,值得注意的是,有不止一個解決方案,在您的原始問題的作品!
編輯:用戶itzy正確地指出,這種解決方案是錯誤的,更糟的是,以多種方式!我對此非常抱歉,我希望在上面的新代碼中解決這些問題。儘管如此,仍然存在一個問題,即對於任何特定的子集和,它只打印出其中一個可能的解決方案。與以前的直接錯誤問題不同,我將其歸類爲有意限制。祝你好運,並提防錯誤!
嗨burningmonk。迴應剛剛刪除的問題:http://iancooper.brinkster.net/Frontpage.aspx是倫敦.NET用戶組。它是Google老兄的第一個結果! – Nobody 2010-08-08 21:32:49