Вот код решения для интеллектуально любопытных (или ленивых).
JavaScript:
var A = "12345";
function riddle(s, n) {
for(var ins=0; ins<s.length; ins++) {
if( recurse(n, "", s, ins) ) {
console.log(ins + " insertions");
break;
}
}
}
function recurse(n, t, s, ins) {
if(ins == 0) {
// reached the end does it equal the number?
var temp = (t != "" ? t + " + " : "") + s;
if( eval(temp) == n ) {
console.log(temp);
return true;
}
return false;
} else if(s.length - ins > 0) {
for(var x=1; x<s.length; x++) {
var temp = (t != "" ? t + " + " : "") + s.substring(0, x);
if( recurse(n, temp, s.substring(x), ins-1) ) {
return true;
}
}
}
return false;
}
riddle(A, 12345);
riddle(A, 357);
riddle(A, 15);
Экспоненциальное время, количество возможностей составляет 2 ^ (n-1), когда n = 3, T (n) = 4; когда n = 5, T (n) = 32.
Если вы считаете, что количество вставок соответствует заданному размеру, а позиции этих вставок являются заданными элементами, вы можете увидеть отношение к сумме поднабора. Также, как Subset Sum, верификатор имеет полиномиальное время, просто суммируя набор цифр («eval (temp) == n» в приведенном выше коде).