为了账号安全,请及时绑定邮箱和手机立即绑定

一个分摊算法的问题?

一个分摊算法的问题?

设置一个数组,输入n个大小不同数,然后把这些数分成m份,怎么才能让所有份之间的数目差之和最小?例如[1,2,5,6,9,2,546,312,26,23],然后分成两份,怎么让这两份每份加起来,然后做差能最小?(每份的个数不用相等)
查看完整描述

4 回答

?
什么鬼_呀你

TA贡献46条经验 获得超35个赞

var arr=[1,9,10,13,20],	
    arr2=[],	
    b=true,compare=0,
    str=[],
    x=0;//次数
    arr.sort(function(a,b){	//先排序
        return a-b;	});
   arr2.push(arr.pop());//先推入最大的一个,
   console.log(arr);
   console.log(arr2);
   while(b&&arr.length>=1){   
    	 let num1=arr.reduce(function(){ 
    	          	return arguments[0]+arguments[1];
    	         }),  
    	   num2=arr2.reduce(function(){ 
    	     	return  arguments[0]+arguments[1]; 
    	     	}) 
   let num=num1-num2; 
   console.log("第"+(x++)+"次num1--"+num1,"num2--"+num2);
   compare=num;
   if(num1<num2){ 
   	console.log("s组合1--"+str[0]+'组合2--'+str[1]);
   	b=false;
   	 }else{ 
   	 str=[];//清空   
   	 arr2.push(arr.shift());
   	 str.push(arr,arr2);
   	 }
  }

emm,就它了,,,

查看完整回答
1 反对 回复 2018-07-20
  • RoughColorText
    RoughColorText
    这样运算输出的结果是30-23=7; 如果组合1--[10,13,1] 组合2--[20,9]就是29-24=5这样更小啊
  • 什么鬼_呀你
    什么鬼_呀你
    21行if循环中加入 let min = str[1][1]; str[0].unshift(min); str[1].splice(1,1) 最后,试了多次,发现倒数第二次才是正确的分配,然后str[1]推出最小到str[0]就好了,emm,但是很无奈,不知道怎么取到倒数第二次的匹配。。。 现在搞得我也很期待到底怎么写才好
  • RoughColorText
    RoughColorText
    加了那句之后这里的结果好像是对了,但是如果改一下原输入的数组,例如改成[1,9,2,2,10,13,20]那么输出的应该是[1,2,2,10,13]和[20,9]也就是29-28=1,但是出来的结果却是s组合1--1,10,13组合2--20,2,2,9
点击展开后面1
?
杏仁酥饼

TA贡献1条经验 获得超0个赞

https://img1.sycdn.imooc.com//5b51597500016c6105150615.jpg

不知道是不是这个意思、、、

查看完整回答
反对 回复 2018-07-20
  • 4 回答
  • 1 关注
  • 1515 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信