我正在尝试创建一个预测2016年大选结果的模型。我需要的一种算法是找到可以加起来270个选举人票的所有可能的状态组合。所以设置就像
const electoralVotesToWin = 270;
const states = [
{ Name: "Virginia", ElectoralVotes: 13 },
{ Name: "North Carolina", ElectoralVotes: 15 },
...
];
我希望的结果就像
var stateCombos = [
[ "Virginia", "North Carolina", ... ],
[ "Virginia", "North Carolina", ....],
...
];
如果我需要更好地解释,请告诉我。
有没有比蛮力方法更好的算法找到每个状态子集?无论哪种方式,这里的任何人都有一个优雅而紧凑但不一定高效的解决方案吗?
答案 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);
注意,为了测试原始对象的使用,但是为了只获取名称,只需更改元素被推入数组的行,因此只推送名称,例如:fiddle