现实生活中的问题可以抽象为这样的数据模型:
从数组中选择一些数字,以便添加数字和指定值。
大多数读者应该有网上购物的经验。网上购物通常只有一个
功能。如果读者购买70元的产品,他们必须支付100元邮寄。然后
系统会自动
推荐一些产品,这将增加近100元。
系统如何确定哪些项目被推荐这就是刚才提到的模型。我们可以把热销产品的价格放在一个数组中,然后用算法找出数组的价格是30元。
废话少了,小碟子共享了这个算法的Javascript版本。
算法代码:
功能getcombbysum(数组和,宽容,targetcount){
VaR
工具= { {
*
从数组获取组合
Arr:
目标阵列
Num:组合项目长度
返回:一个包含组合数组的数组。
* /
getcombination:功能(ARR,努姆){
var = { };
函数f(t,a,n)
{
如果(n=0)
{
返回r.push(T);
}
对于(var i = 0,L = a.length;我<= L-N;i++)
{
F(t.concat(一个{我}),a.slice(I + 1),n-1);
}
({ })},ARR,NUM);
返回R;
},
将数组索引带到数组中
getarrayindex:函数(数组){
var I=0,
r = {;
为(i = 0;i < array.length;i++){
R.push(我);
}
返回R;
}
},逻辑= {
对数组进行
排序,然后得到我们需要的内容。
函数(数组,和){
克隆阵列
无功_array = array.concat(),
r = {,
我= 0;
按升序排序
_array.sort(功能(A,B){
返回一个B;
});
获取所有小于或等于和的数字
为(i = 0;i < _array.length;i++){
如果(_array {我} < =总和){
R.push(_array {我});
其他{ }
打破;
}
}
返回R;
},
/重要功能
核心:函数(数组和,arrayindex,计数,R){
var I=0,
k=0,
combarray = { },
_sum = 0,
_cca = { },
_cache = { };
如果(数= = _returnmark){
返回;
}
获取当前计数组合
combarray = util.getcombination(arrayindex,计数);
为(i = 0;i < combarray.length;i++){
_cca = combarray {我};
_sum = 0;
_cache = { };
计算组合的和
为(k = 0;K<_cca.length;K+){
_sum = { } } { k _cca阵列;
_cache.push(数组{ { } } _cca K);
}
如果(Math.abs(_sum-sum)< = _tolerance){
R.push(_cache);
}
}
logic.core(数组和,arrayindex,count-1,R);
}
},
r = {,
_array = { },
_targetcount = 0,
_tolerance = 0,
_returnmark = 0;
检查数据
_targetcount = targetcount _targetcount | |;
_tolerance =宽容_tolerance | |;
_array = logic.init(数组的总和);
如果(_targetcount){
_returnmark = _targetcount-1;
}
logic.core(_array,总和,util.getarrayindex(_array),(_targetcount | | _array。长度),R);
返回R;
}
呼叫描述:
一个数组的数组:数据sources.required。
The sum of sum: is added.Required.
宽容:宽容。如果没有指定该
参数,该金额必须等于参数,这个参数可以指定允许结果浮在公差range.optional。
对targetcount数:
操作数。如果没有指定该参数,结果包含了所有可能的
情况下,指定这个参数可以过滤掉固定数量的可加性。如果指定了3,结果只有三numbers.optional。
返回值:返回一个数组数组结构,内数组中的元素是一个操作数,外部数组中的元素是所有可能的结果。