一.分析
- 两组分值相差最低的,也就是说一个数组分成两个子集,其子集和的差值最小
- 可以换成背包问题,即从数组中选取一半的数作为子集,让这些子集的和与原来总和的一半越接近即可
- 从中选取与一半的总和最接近的一个子集(即需要排序)
二.代码如下
object TestLm extends App {
import scala.io.StdIn
println("请输入10个数字,以空格区分:")
val line = StdIn.readLine()
val arr = line.split("\\s+").map(_.toInt)
val size_ = arr.size/2
val sum_ = arr.sum/2
val iterator= arr.combinations(size_)
val arr1 = iterator.toArray.map(x=>(math.abs(x.sum-sum_),x)).sortBy(_._1).head._2
val arr2 = arr.diff(arr1)
println(arr1.mkString(",")+" 和:"+arr1.sum)
println(arr2.mkString(",")+" 和:"+arr2.sum)
println("差值为:"+math.abs(arr1.sum-arr2.sum))
}
三.结果如下:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/be0b0584f8820abcd82c85a473c5bfc3.png)