Der „gescheiter“ -Ansatz (dynamische Programmierung verwendet wird) ist im Grunde diese:
Für jede Teilkette der ursprünglichen Zeichenfolge, alle möglichen Werte herauszufinden, es schaffen. (z. B. in Ihrem ersten Beispiel "12" kann entweder 1 + 2 = 3 oder 1 * 2 = 2)
Es kann viele verschiedene Kombinationen geben, aber viele von ihnen werden Duplikate sein. (Außerdem sollten Sie alle Kombinationen ignorieren, die größer als das Ziel sind).
Wenn Sie also ein "+" oder ein "*" hinzufügen, können Sie sich vorstellen, dass es zwei Teilstrings des Strings kombiniert. (Und da Sie die möglichen Werte für jeden Teilstring haben, können Sie sehen, ob eine solche Kombination möglich ist)
Diese Werte können auf ähnliche Weise generiert werden: Versuchen Sie, den Teilstring auf alle möglichen Arten aufzuteilen, und kombinieren Sie die verschiedenen Werte in jeder Hälfte der Teilzeichenfolge.
Die Gesamtzahl der "Zustände" ist dann etwas wie | S |^2 * Ziel - für Ihren Beispielfall ist es schlechter als die Brute-Force-Methode. Wenn Sie jedoch eine Zeichenfolge der Länge 1000 und ein Ziel von beispielsweise 5000 hätten, wäre das Problem mit der dynamischen Programmierung lösbar.
+1 für die Schätzung der Umstellung von Brute-Force zu Cleverness. – RBerteig