贝壳,java,笔试最后一题怎么做?

题目是这样的:给定一个数组,将其分为两部分,A和B,要求A的和与B的和相差最小;在这个前提下,让A包含的个数与B包含的个数相差尽可能大。
输出:这两部分的和之差 以及 个数之差。
示例:输入 1 2 3 4 5 6, 输出:1,2 (和相差1, 个数相差2, 比如:1 2 3 4, 5 6)

我测试用例能过,但是会超时,最后过了36%
思路是:
两部分中一定有一部分小于等于sum/2 , 这部分越大越好。所以先算这部分最大能有多大。
于是用动态规划,dp[a][b], 代表前a个中取一些数,和为b的可能性,一直遍历到b <= sum/2
小的那部分和应该为多少。
假设这一步得到的结果是A
接下来问题就变成了从数组中找和为A的子序列,这些子序列中个数最多和最少的。
然后我用的回溯法,我感觉就是这个回溯法超时了,但是不知道该怎么整了。
#贝壳找房##笔试题目#
全部评论
动态规划 我用了三轮 第一小问最小重量差和装箱问题的思路很像 只是将箱子容量看作物品总重量的一半 至于最大个数差 我又用了两轮动规 分别维护了max 和 min 方便最终对比取值 最终ac了 但感觉不是最优
点赞 回复
分享
发布于 2019-08-23 23:20

相关推荐

点赞 7 评论
分享
牛客网
牛客企业服务