我今天遇到了这样的问题。一个序列被分成n段,要求??每段的和之差的最大值最小。也就是说,要求每段的和尽可能接近序列和S/n。需要一个最优解。这个想法或代码是实用的。应用场景:如果没有规划瀑布排版的应用场景,这个问题其实还是挺复杂的,可能会涉及到一些预期的预测。但是,这里的主题提供了一个应用场景。这个应用场景有一些特点可以简化这个问题。特点一:序列中各个元素之间的差异不会太大,不会有>>或者<<。特征二:序列数量不会太少,不会出现边缘情况。特点三:段数不会太大大特点四:可以接受一定的误差。基于这些特征,可以排序一个简单的解决问题的想法。将其从大到小放入N个桶中,在每个桶中找到最小的桶放入当前桶中。值,循环到最后,数字越多,误差越小接下来,演示代码publicclassMasonryLayout{//初始化一个数字队列ListinitData;//记录被分成几组intslotCount;类节点{int位置;整数重量;@OverridepublicStringtoString(){return"Node{"+"position="+position+",weight="+weight+'}';}publicStringprint(){return"{"+position+","+weight+'}';}}类总和{intsum;列表<节点>节点列表;publicSums(intsum){这个。总和=总和;nodeList=newArrayList<>();}publicvoidaddNode(Nodenode){nodeList.add(node);总和+=节点权重;}@OverridepublicStringtoString(){return"Sums{"+"sum="+sum+'}';}publicStringprint(){//按位置升序重新排列nodeList。sort(Comparator.comparingInt(o->o.position));返回“SUM:”+sum+“节点:”+nodeList.stream()。map(node->node.print()).collect(Collectors.joining("-"));}}publicMasonryLayout(intbasic,intlength,intslotCount){//这里只是创建模拟数据的代码initData=newArrayList<>();随机random=newRandom();intseed=random.nextInt(basic)+basic;System.out.println("种子:"+seed);对于(inti=0;isortData=newArrayList<>();TreeSetsumSet=makeTreeSet();for(inti=0;io2.weight-o1.weight);System.out.println(sortData);for(Nodenode:sortData){sumSet.first().addNode(node);TreeSetsumSet1=sumSet;sumSet=makeTreeSet();sumSet.addAll(sumSet1);}sumSet.forEach(sums->{System.out.println("片段:"+sums.pr整数());});}TreeSetmakeTreeSet(){returnnewTreeSet<>(newComparator(){@Overridepublicintcompare(Sumso1,Sumso2){//升序排列,这里取最小值intret=o1.sum-o2.sum;if(ret==0){returno1.hashCode()-o2.hashCode();}else{returnret;}}});}publicstaticvoidmain(String[]args){MasonryLayoutmasonryLayout=newMasonryLayout(20,60,4);masonryLayout.execute();}}执行结果原始数据:[44,36,43,41,40,44,40,40,37,40,36,39,43,36,41,39,36,36,44,44,38,41,38,38,36,39,43,38,44,38,36,37,43,44,40,37,37,39,44,43,40,38,39,37,42,38,40,38,42,39,36,40,40,36,39,43,44,35,38,37]段:SUM:593节点:{4,40}-{5,44}-{6,40}-{11,39}-{12,43}-{23,38}-{24,36}-{31,37}-{33,44}-{40,40}-{42,39}-{45,38}-{55,43}-{57,35}-{59,37}分割:SUM:593节点:{1,36}-{3,41}-{7,40}-{13,36}-{15,39}-{18,44}-{26,43}-{27,38}-{30,36}-{35,37}-{38,44}-{44,42}-{46,40}-{47,38}-{49,39}分割:SUM:593节点:{9,40}-{10,36}-{14,41}-{16,36}-{19,44}-{25,39}-{29,38}-{32,43}-{36,37}-{48,42}-{50,36}-{51,40}-{54,39}-{56,44}-{58,38}分割:SUM:594节点:{0,44}-{2,43}-{8,37}-{17,36}-{20,38}-{21,41}-{22,38}-{28,44}-{34,40}-{37,39}-{39,43}-{41,38}-{43,37}-{52,40}-{53,36}{原位置,原值}在上面的节点中,欢迎关注公众号,共同进步