最近私はこの質問をしました。私はそれを爆破し、私はそれにいくつかの助けが好きです。質問は次のようになりました。候補リストがあれば、線形時間で目標値に達することができますか?
数字のリストが表示されます。数字はすべて正の整数です。だから我々はn
番号を持っている
[x_0, x_1, ..., x_{n-2}, x_{n-1}]
:だから彼らにこのようなものを想像してみてください。数字が異なるという保証はありません。目標値もあります。これをX
としましょう。 X
も正の整数です。私たちは、次の形式で候補者の観点から目標数、X
を、表現することができるかどう
目標は、出力にブールだけTrue/False
です:
a * x_0 + b * x_1 + ...
係数のための唯一の制約は、これらのこともあります
候補の数値で数学を少し行うだけで、線形時間で答えを得ることができます。しかし、アルゴリズムが少し複雑になっているのが分かりました。それはコード化する必要はありません - 私はそれを行うことができます - しかし、私はまだ正確にアルゴリズムを持っていません。私は多分Sieve of Eratosthenesへのアプローチで、あるいは多分Diophantine Equationに似た何かを考えていました。それにもかかわらず、私はどこでもオンラインで解決策のクリーンアップを見つけることができず、この問題がもっと探求されたのか不思議でした。
誰もが考えていますか?再度、感謝します!本当に助けていただきありがとうございます!ふるいを使用して
係数が単純な整数である場合、 'gcd(x_0、x_1、...、x_n)'が 'X'を分けることを確認するだけです。それ以外の部分はユークリッドのアルゴリズムを逆方向にたどってGCDを得てから、右の数を掛けて 'X'を得る。しかし、「a * 21 + b * 35」は正の係数で「49」になることはできません。 – btilly
@btillyしかし、これは共通の分母を持たないもののためにはどうなりますか?私はあなたのアルゴリズムが簡単なテストケースのために働くことに同意しますが、ターゲット 'X = 27'と私たちの候補は' [2,3]です。 2と3の間にgcdはないので、2と3の間の組み合わせをチェックするだけでよいので、ブルートフォースにつながります。これはあなたの恋人の考え方の正しい行ですか?ありがとう! – jlarks32
それらの間のGCDは '1 = 3-2 'なので、単純なアルゴリズムは' 27 * 3 - 27 * 2'となります。あなたが見ているように、係数は、しかし、陽性ではありません。 – btilly