【问题标题】:How to generate an addition equation for a number using only required set of numbers?如何仅使用所需的一组数字为数字生成加法方程?
【发布时间】:2018-02-28 00:42:22
【问题描述】:

我想为一个看起来像的随机数生成一个加法方程

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;

方程中元素的最大数量是 5。在 java 脚本中可以吗?提前谢谢。

【问题讨论】:

  • 你能澄清一下这个问题吗?
  • 可以接受更多随机数的解决方案吗?
  • 是的@Nitheesh。例如我需要的数字是 8,我想显示为 5+2+1。生成的方程编号 5,2,1 仅来自集合 [1,2,5,10,50]。清楚了吗?
  • 是的@Alexandru-IonutMihai。但生成的方程编号仅来自集合。
  • 例如:对于 randomNumber = 28; addEquation = 10+10+5+2+1...好吧,如果您允许多次使用设置项,那么您将有很多解决方案...一个是1 + 1 + ... + 1 + 1 = 28

标签: javascript html random


【解决方案1】:

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

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));

然后您可以选择结果集中最短的一个。但是,根据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));

我相信在性能方面这不能被轻易击败。只需 0.190 毫秒即可获得结果 [[1,2,5,10,10]]

【讨论】:

  • a,t,h,n,i,j - 这是我能想象到的最邪恶的事情
  • 使用 DP !竖起大拇指:)
  • @Sebastian Kaczmarek a 代表输入数组,t 代表目标值,h 代表哈希表,n 代表评估中的当前数字,i 和 @987654337 @ 显然是循环索引。 :)。
  • @Redu。你真是太棒了兄弟。谢谢。
  • @Redu,不错的解决方案。 +1 :)
【解决方案2】:

这个问题可以通过recursive组合所有可能的sums解决,直到我们达到目标

一个解决方案包含maximum 5 作为长度,其中5setOfNums 数组的长度。

var randomNumber = Math.floor(Math.random() * 30) + 1;
console.log(randomNumber);
var setOfNums = [1,2,5,10,50];
setOfNums=setOfNums.sort(function(a,b){
  return b-a;
});
subset_sum(setOfNums,randomNumber);
function subset_sum(numbers, target, partial){
       partial = partial || [];
       s = partial.reduce(function(contor,elem){
        return contor+elem;
       },0);
       if(s == target){
        partial=partial.sort(function(a,b){
          return a-b;
        });
        console.log("sum"+JSON.stringify(partial)+"="+ target);
       }
       if(s >= target)
         return;
       if(partial.length>numbers.length)
         return;

     numbers.forEach(function(number,index){
        n = numbers[index];
        subset_sum(numbers, target, partial.concat(n)); 
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多