|
发表于 2023-10-2 16:49:46
|
显示全部楼层
如图,从第2行起,设置每个节点结构为(sum,min,dis)sum表示目前能取到的最大和值(当然,有不大于平均值P的限制)
min表示目前的数列中的最小值
dis表示目前数列分成两组,两组和值的最小差值
可以找出节点之间的对应关系。
父节点pt(sum,min,dis)
两子节点p1(sum1,min1,dis1)、p2(sum2,min2,dis2)
min=min2
dis=max(dis1,dis2)-min(dis1,dis2)
sum=if(sum1+min2<=p,sum1+P,max(sum1,sum2))
根据最后的根节点再返回寻找其中一组数据(剩下的就为另一组数据)
若sum=sum1+min2,则该组数据由min2和节点1中的叶子节点中组成;
若sum=sum1,则该组数据由节点1中的叶子节点中组成;
若sum=sum2,则该组数据由节点2中的叶子节点中组成;
如图中根节点(59,3,0),返回寻找(红线)得3,21,35。
备注:程序目的是取得最接近平均值P的最大和值,dis定义有些问题(从第三行开始,仅仅表示目前存在差值为dis的两个分组,并不一定是差值最小的分组),但不影响最终结果sum最接近P。
本算法复杂度为O(n^2),网上说这是NP问题的应该不对吧。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|