英雄联盟对战,为求公平需要选取两组分值相差最低的队伍

一.分析

  • 两组分值相差最低的,也就是说一个数组分成两个子集,其子集和的差值最小
  • 可以换成背包问题,即从数组中选取一半的数作为子集,让这些子集的和与原来总和的一半越接近即可
  • 从中选取与一半的总和最接近的一个子集(即需要排序)

二.代码如下

object TestLm extends App {
  import  scala.io.StdIn
  //输入
  println("请输入10个数字,以空格区分:")
  val line = StdIn.readLine()
  //对输入切割成数组并且转为Int
  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))
}

三.结果如下:

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值