L'approche « plus intelligent » (en utilisant la programmation dynamique) est essentiellement ceci:
Pour chaque sous-chaîne de la chaîne d'origine, comprendre toutes les valeurs possibles qu'il peut créer. (Par exemple dans votre premier exemple "12" peut devenir 1 + 2 = 3 ou 1 * 2 = 2)
Il peut y avoir beaucoup de combinaisons différentes, mais beaucoup d'entre elles seront des doublons. (De même, vous devez ignorer toutes les combinaisons supérieures à la cible). Ainsi, lorsque vous ajoutez un "+" ou un "*", vous pouvez l'envisager comme combinant deux sous-chaînes de la chaîne. (et puisque vous avez les valeurs possibles pour chaque sous-chaîne, vous pouvez voir si une telle combinaison est possible)
Ces valeurs peuvent être générées de manière similaire: essayez de diviser la sous-chaîne de toutes les manières possibles, et combinez les différentes valeurs dans chaque moitié de la sous-chaîne. Le nombre total de "states", alors, est quelque chose comme | S |^2 * target - pour votre exemple, c'est pire que la méthode brute-force. Mais si vous aviez une chaîne de 1000 et une cible de 5000, le problème serait résolu avec la programmation dynamique.
+1 pour estimer le basculement entre la force brute et l'intelligence. – RBerteig