查找加起来数字的子集的最快算法是什么?

时间:2016-06-30 15:02:48

标签: javascript algorithm

我正在尝试创建一个预测2016年大选结果的模型。我需要的一种算法是找到可以加起来270个选举人票的所有可能的状态组合。所以设置就像

const electoralVotesToWin = 270; 
const states = [
   { Name: "Virginia", ElectoralVotes: 13 },
   { Name: "North Carolina", ElectoralVotes: 15 },
   ... 
];

我希望的结果就像

var stateCombos = [
    [ "Virginia", "North Carolina", ... ],
    [ "Virginia", "North Carolina", ....], 
    ...
];

如果我需要更好地解释,请告诉我。

有没有比蛮力方法更好的算法找到每个状态子集?无论哪种方式,这里的任何人都有一个优雅而紧凑但不一定高效的解决方案吗?

1 个答案:

答案 0 :(得分:0)

这可能需要进一步的实时测试,但是可以使用递归函数来创建组合,直到达到目标(或者在此实现中,直到没有剩余):

function getStates(arr, rem){    
    var res = [], el;
    while(arr.length){
        [el, ...arr] = arr;        
      if(el.ElectoralVotes >= rem) 
            res.push([el]); //total reached
      else{
        for(var s of getStates(arr,rem - el.ElectoralVotes)) //try to reach total with remainder        
          res.push([el, ...s]);
      }
    }
   return res;
}


var res= getStates(states, electoralVotesToWin);

Test fiddle

注意,为了测试原始对象的使用,但是为了只获取名称,只需更改元素被推入数组的行,因此只推送名称,例如:fiddle