如何仅使用所需数字组生成数字的加法方程式?

Sur*_*eja 5 html javascript random

我想为随机数生成一个加法方程式

5 + 10 + 2来自一组数字,即[1,2,5,10,50].

var randomNumber = Math.floor(Math.random() * (10 - 1 + 1)) + 1;
var setOfNums = [1,2,5,10,50];
var additionEquation; //ex: for randomNumber = 28; additionEquation = 10+10+5+2+1;
Run Code Online (Sandbox Code Playgroud)

等式中元素的最大数量是5.是否可以在java脚本中使用?提前感谢.

Red*_*edu 5

您可能有多个解决方案.动态规划方法可以有效地解决这个问题;

function getCombos(a,t){
  var h = {},
    len = a.length,
      n = 0;

  for (var i = 0; i < len; i++){
    n = a[i];
    h[n] ? h[n].push([n]) : h[n] = [[n]];
    for(var j = a[0]; j <= t-n; j++){
      h[j] && (h[j+n] = h[j+n] ? h[j+n].concat(h[j].map(s => s.concat(n)))
                               : h[j].map(s => s.concat(n)));
    }
  }
  return h[t] || [];
}

var arr = [1,2,5,10,50],
 target = 28,
 result = [];
console.time("combos");
result = getCombos(arr,target);
console.timeEnd("combos");
console.log(`${result.length} solutions found`);
console.log(JSON.stringify(result));
Run Code Online (Sandbox Code Playgroud)

然后,您可以选择结果集中最短的一个.然而,根据一个maxlen遗嘱的意愿进行计算,使我们无法计算过多的结果,以便稍后过滤掉.因此,以下代码仅在maxlen实现之前起作用.

function getCombos(a,t,l){
  var h = {},
    len = a.length,
      n = 0;

  for (var i = 0; i < len; i++){
    n = a[i];
    h[n] ? h[n].push([n]) : h[n] = [[n]];
    for(var j = a[0]; j <= t-n; j++){
      h[j] && (h[j+n] = h[j+n] ? h[j+n].concat(h[j].reduce((r,s) => s.length < l ? (r.push(s.concat(n)),r) : r, []))
                               : h[j].reduce((r,s) => s.length < l ? (r.push(s.concat(n)),r) : r, []));
    }
  }
  return h[t] || [];
}

var arr = [1,2,5,10,50],
 target = 28,
 maxlen = 5,
 result = [];
console.time("combos");
result = getCombos(arr,target,maxlen);
console.timeEnd("combos");
console.log(result.length)
console.log(JSON.stringify(result));
Run Code Online (Sandbox Code Playgroud)

我相信表现明智,不能轻易打败.只需0.190毫秒即可获得结果[[1,2,5,10,10]].