- 积分
- 19860
- 明经币
- 个
- 注册时间
- 2013-10-29
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2019-11-6 00:14:08
|
显示全部楼层
本帖最后由 mahuan1279 于 2019-11-6 08:59 编辑
分两组的情况:
如图,从第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
|