你开枪吧 2021-04-20 14:04 采纳率: 33.3%
浏览 116
已采纳

从一组数字中,找出N个相加最接近一个指定数字的N组数字来 请问用java怎么实现? 求大佬

从一组数字中,找出N个相加最接近一个指定数字的N组数字来 请问用java怎么实现? 求大佬

  • 写回答

2条回答 默认 最新

  • 「已注销」 2021-04-20 15:44
    关注
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    /**
     * 基本思路,要求数组中的N个数的和与目标数最接近的情况
     * 枚举出数组中所有N个数的组合情况,比如[1,2,3],所有结果[1,2],[1,3],[2,3],然后将和与目标值比较
     * 具体思路是通过递归,从数组的第一位开始,每一位都是可选可不选的情况
     * 当选择的数量达到N个时截止,求此时的和是否最接近目标数
     * (这里通过一个临时变量记录最小的差异已经临时结果,每次迭代最小的差异和结果)
     */
    public class Main {
        public static void main(String[] args) {
            arr = new int[]{1, 2, 3, 4, 5};
            target = 9;
            N = 3;
            fun(0, 0, new ArrayList<>());
            System.out.println(result);
        }
    
        static int[] arr;
        static int minDiff = Integer.MAX_VALUE;
        static int target;
        static int N;
        static Set<List<Integer>> result = new HashSet<>();
    
        public static void fun(int curIndex, int cnt, List<Integer> temp) {
            int diff = sum(temp) - target;
            // 如果和减去target结果大于当前最小的差异提前结束
            if (diff > minDiff) {
                return;
            }
            // 选出了N个数字,求和减去目标数的绝对值是否小于当前求得的最小差异
            // 如果等于则添加预选结果(结果可能多个)
            // 如果小于则替换最小差异,先清空当前结果列表,并将此结果添加尾预选结果
            if (cnt == N) {
                if (Math.abs(diff) == minDiff) {
                    result.add(new ArrayList<>(temp));
                }
                if (Math.abs(diff) < minDiff) {
                    result.clear();
                    minDiff = Math.abs(diff);
                    result.add(new ArrayList<>(temp));
                }
                return;
            }
            // 已经到末尾了
            if (curIndex == arr.length) {
                return;
            }
            temp.add(arr[curIndex]);
            fun(curIndex + 1, cnt + 1, new ArrayList<>(temp));
            temp.remove(cnt);
            fun(curIndex + 1, cnt, new ArrayList<>(temp));
        }
    
        public static int sum(List<Integer> list) {
            return list.stream().mapToInt(e -> e).sum();
        }
    }

    运行结果:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度