应用场景:小餐馆根据自己的菜单价格,为追求利益最大化,推出一些满n减的活动,这n其实是所有价格随意组合后的一个临界值,代码中运用到了二进制
//所有菜价
var priceList= [13,18,21,23,12,11,18,9];
var groupList=group(priceList);
var sumList=getSum(groupList);
console.log(groupList);
console.log(sumList);
/**
* 获取数组的所有组合方式
* @author benboerba 2019-03-14
* @param {[type]} 数组
* @return {[type]}
*/
function group(arr){
var result=[];
var pow = Math.pow(2, arr.length);
for (var a=1;a<pow;a++){
var char1 = a.toString(2).split("");
var cl = char1.length;
var d="";
for (var i=0 ;i<cl;i++){
d=d+char1[cl-i-1];
}
var chars=d.split("");
var p="";
for (var j=0;j<char1.length;j++){
var c =parseInt(chars[j]+"");
if (0!=c){
p=p+c*arr[j]+",";
}
}
p=p.substring(0,p.length-1);
result.push(p);
}
return result;
}
/**
* 获取每种组合的和
* @author benboerba 2019-03-14
* @param {[type]} arr
* @return {[type]}
*/
function getSum(arr){
var result=[];
for (var i = arr.length - 1; i >= 0; i--) {
var temp=arr[i].split(",");
var sum=0;
for (var j= temp.length - 1; j>= 0; j--) {
sum=sum+(temp[j]-0);
}
if(result.indexOf(sum)==-1){
result.push(sum);
}
}
return result.sort(function(a,b){
if(a>b){
return 1;
}else if(a==b){
return 0;
}else{
return -1;
}
});
}