2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福哥答案2020-02-25:
自然智慧即可。
1.递归。有代码。
2.动态规划。dp是三维数组。有代码。
代码用golang编写,代码如下:
package main
import "fmt"
const INT_MAX = int(^uint(0) >> 1)
const INT_MIN = ^INT_MAX
func main() {
arr := []int{1, 2, 3, 4, 100}
ret := right1(arr)
fmt.Println("1.递归:", ret)
ret = right2(arr)
fmt.Println("2.动态规划:", ret)
}
func right1(arr []int) int {
if len(arr) < 2 {
return 0
}
sum := 0
for _, v := range arr {
sum += v
}
if len(arr)&1 == 0 {
return process1(arr, 0, len(arr)/2, sum/2)
} else {
ret1 := process1(arr, 0, len(arr)/2, sum/2)
ret2 := process1(arr, 0, len(arr)/2+1, sum/2)
if ret1 < ret2 {
return ret2
} else {
return ret1
}
}
}
func process1(arr []int, i int, picks int, rest int) int {
if i == len(arr) {
if picks == 0 {
return 0
} else {
return -1
}
} else {
p1 := process1(arr, i+1, picks, rest)
p2 := -1
next := -1
if arr[i] <= rest {
next = process1(arr, i+1, picks-1, rest-arr[i])
}
if next != -1 {
p2 = arr[i] + next
}
return GetMax(p1, p2)
}
}
func right2(arr []int) int {
if len(arr) < 2 {
return 0
}
sum := 0
for _, v := range arr {
sum += v
}
sum >>= 1
N := len(arr)
M := (len(arr) + 1) >> 1
dp := make([][][]int, N)
for i := 0; i < N; i++ {
dp[i] = make([][]int, M+1)
for j := 0; j < M+1; j++ {
dp[i][j] = make([]int, sum+1)
for k := 0; k < sum+1; k++ {
dp[i][j][k] = INT_MIN
}
}
}
for i := 0; i < N; i++ {
for k := 0; k <= sum; k++ {
dp[i][0][k] = 0
}
}
for k := 0; k <= sum; k++ {
if arr[0] <= k {
dp[0][1][k] = arr[0]
} else {
dp[0][1][k] = INT_MIN
}
}
for i := 1; i < N; i++ {
for j := 1; j <= GetMin(i+1, M); j++ {
for k := 0; k <= sum; k++ {
dp[i][j][k] = dp[i-1][j][k]
if k-arr[i] >= 0 {
dp[i][j][k] = GetMax(dp[i][j][k], dp[i-1][j-1][k-arr[i]]+arr[i])
}
}
}
}
return GetMax(dp[N-1][M][sum], dp[N-1][N-M][sum])
}
func GetMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
func GetMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。的更多相关文章
- 你与优秀源码之间只差一个 Star
fir.im Weekly - 你与优秀源码之间只差一个 Star 说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者 ...
- 你离高薪 offer 只差一个Redis入门,我是认真的
说起来,可能有些小伙伴会不相信,我是第一次用 Redis,真的.因为公司小,业务量小,Redis 根本派不上用场.不过,最近打算把系统升级一下,顺带把当下时髦的技术入个门,"与时俱进&quo ...
- 成为数据专家,你只差一个Quick Insights的距离
身处如今的大数据时代,你真的知道如何处理数据和分析数据吗?或许那些被你忽视的数据背后就暗藏着重要的商业灵感.并非人人都是数据专家,有时候你需要一些专业的软件来帮你处理数据.那么如何能快速.准确地从数据 ...
- fir.im Weekly - 你与优秀源码之间只差一个 Star
说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者心生向往.那么如何正确的使用 Github,也许是编程学习之必要.来看下 ...
- 你与论文达人只差一个MathType的距离
在理工类的论文文档中总是少不了数学公式的出现,各种符号夹杂在期间导致论文在编写时总是会出现各种各样的问题.但是这些问题在论文达人们手中全都不是事儿!分分钟搞定你数学公式上出现的问题!论文达人们是怎么搞 ...
- 在O(N)时间内求解 正数数组中 两个数相加的 最大值
一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...
- 高并发情况下Linux系统及kernel参数优化
众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制.内核TCP参数方面和IO事件分配机制等.下面就从几方面来调整使Linux系统能够支持高并发环境. Iptabl ...
- 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表
这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组
题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...
随机推荐
- supervisor不一样的日志轮转
出于项目需求,需要读取某个进程的最新日志,而这个进程刚好是supervisor管控. 很自然地我就想到了,根据日志的编辑时间排序,获取最新的日志文件. 然而,发现了奇怪的一幕: 发现什么没有? web ...
- SQL中通过表字段名称查询对应表名称
select * from sys.objects as a where a.object_id in(select [OBJECT_ID] from sys.all_columns where na ...
- UGUI按Tab键切换输入框
脚本挂在输入框的父物体上即可 [code]csharpcode: using System.Collections; using System.Collections.Generic; using U ...
- 声网 MetaKTV 技术揭秘之“声临其境”:3D 空间音效+空气衰减+人声模糊
声网近期发布了"MetaChat 元语聊"."MetaKTV"解决方案,致力于提供一种全新的元宇宙互动社交.K 歌方式,其中都提到了"3D 空间音频& ...
- Windows10彻底关闭自动更新
此文操作流程只针对于Windows10 1803及以下版本,更新版本未测试. Windows10在本地组策略编辑器禁用了自动更新,系统依然会在某个时候触发自动更新,怎么办呢,方法来了. 这个方法是结合 ...
- 移动端网页--better-scroll介绍
移动端网页--better-scroll介绍 Options 起始位置及滚动方向 startX:0 开始时的X轴位置 startY:0 开始时的Y轴位置 scrollY: true 滚动方向为 Y 轴 ...
- ACM-NEFU新生训练2-排序和CMP
A.谁考了第k名-排序 Description 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩. Input 第一行有两个整数,分别是学生的人数n(1≤ ...
- Numpy数组乘法
Numpy数组乘法 元素级乘法 numpy.multiply() 或 * : 数组对应位置元素相乘 import numpy as np # 一维数组 a = np.array([1, 2, 3, 4 ...
- Kubernetes客户端认证(二)—— 基于ServiceAccount的JWTToken认证
1.概述 在 Kubernetes 官方手册中给出了 "用户" 的概念,Kubernetes 集群中存在的用户包括 "普通用户" 与 "Service ...
- MySQL(四)用户与权限管理
用户与权限管理 用户管理 MySQL用户分为普通用户和root用户,提供了许多语句来管理包括登录.退出MySQL服务器.创建用户.删除用户.密码管理和权限管理等内容. 登录MySQL服务器 mysql ...