Java 构成最大和的数字

Java 构成最大和的数字,java,algorithm,java-8,Java,Algorithm,Java 8,我刚写了一个程序,从数组中找出最大和, 但我陷入了困境,有什么办法可以让我找出哪些数字对最大总和起了作用 给出了最大和的规则:相邻元素不应参与 总而言之 数组中最大和的解决方案: public class MaximumELementInARray { public static void main(String[] args) { Scanner reader = new Scanner(System.in); String[] al = reader.

我刚写了一个程序,从数组中找出最大和, 但我陷入了困境,有什么办法可以让我找出哪些数字对最大总和起了作用

给出了最大和的规则:相邻元素不应参与 总而言之

数组中最大和的解决方案:

public class MaximumELementInARray {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        String[] al = reader.nextLine().split(" ");
        int[] input = Arrays.stream(al).mapToInt(Integer::parseInt).toArray();
        MaximumELementInARray mm = new MaximumELementInARray();
        int maxi = mm.maximumm(input);
        System.out.println(maxi);
    }

    public int maximumm(int[] a) {
        List<Integer> ex = new ArrayList<>();
        List<Integer> inc = new ArrayList<>();
        int incl = a[0];
        int excl = 0;
        int excl_new;
        for (int i = 1; i < a.length; i++) {
            excl_new = Math.max(incl, excl);
            incl = excl + a[i];
            excl = excl_new;
        }
        System.out.println(incl > excl ? inc : ex);
        return incl > excl ? incl : excl;
    }
}

输入:-1 7 8-5 4 产出:12 总和由8+4组成


输入:3 2 1-1 产出:4 总和由3+1组成


等等……

您可以按照此代码操作

    int toIndex = 3, fromIndex = 0;
    List<Integer> result = new ArrayList<>();
    while (toIndex < numbers.size()) {
        Map<Integer, Integer> map = IntStream
                .range(fromIndex, toIndex)
                .filter(i->numbers.get(i)>0)
                .mapToObj(i -> new AbstractMap.SimpleEntry<>(i, numbers.get(i)))
                .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey,(a,b)->b));
        // find max of sublist
        int maxOfSub = numbers.subList(fromIndex, toIndex).stream().max(Integer::compareTo).get();
        //update indexes
        fromIndex = map.getOrDefault(maxOfSub,toIndex-1) + 2;
        toIndex += fromIndex;

        if (maxOfSub > 0)
            result.add(maxOfSub);
    }
    int lastMax = numbers.subList(fromIndex, numbers.size()).stream().max(Integer::compareTo).get();
    if (lastMax > 0)
        result.add(lastMax);
    System.out.println(result);
    System.out.println(result.stream().reduce(0, Integer::sum));
int-toIndex=3,fromIndex=0;
列表结果=新建ArrayList();
而(toIndexnumber.get(i)>0)
.mapToObj(i->newAbstractMap.SimpleEntry(i,numbers.get(i)))
.collect(Collectors.toMap(Map.Entry::getValue,Map.Entry::getKey,(a,b)->b));
//查找子列表的最大值
int maxOfSub=numbers.subList(从索引到索引).stream().max(整数::compareTo.get();
//更新索引
fromIndex=map.getOrDefault(maxOfSub,toIndex-1)+2;
toIndex+=fromIndex;
如果(maxOfSub>0)
结果。添加(maxOfSub);
}
int lastMax=numbers.subList(fromIndex,numbers.size()).stream().max(Integer::compareTo.get();
如果(lastMax>0)
结果。添加(lastMax);
系统输出打印项次(结果);
System.out.println(result.stream().reduce(0,Integer::sum));

先生,最大总和是根据总和中不应有相邻元素的规则计算的。在您的情况下,最大总和是多少?你不是指一个和最大的子集吗?对于你的例子,将是
7+8+(-5)+4+9
?先生,最大和是正确的,在我的例子中,我是否可以标记哪些元素对最大和有贡献?你试图解决一个任务,找到一个给定数字的子集和,这在一般情况下是NP完全的,通常通过动态规划来解决。更好的解决方案是修改
MaximumELementInARray.maximum
方法,不仅返回结果和本身,还返回构成结果和的结果。@Alexalauyou,我喜欢这个解决方案和方法。@tromu添加了演示来回答。嘿,谢谢,但输出只有20,它不打印哪些数字构成20,答案应该是8,9,3而不是20。此外,您的程序将9作为
5 10 4-1
的和,最大和应该是10:(哇,所有案例都包含在内,但至少1个案例没有通过。
4543
,应该给出[4,4]或[5,3],但我在线程“main”中遇到异常java.lang.IllegalStateException:重复键0,无论如何都可以解决此方案?非常感谢你。如果我想得到
4 4
,因为作为
4
的输出也构成和8,我该怎么办?
    int toIndex = 3, fromIndex = 0;
    List<Integer> result = new ArrayList<>();
    while (toIndex < numbers.size()) {
        Map<Integer, Integer> map = IntStream
                .range(fromIndex, toIndex)
                .filter(i->numbers.get(i)>0)
                .mapToObj(i -> new AbstractMap.SimpleEntry<>(i, numbers.get(i)))
                .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey,(a,b)->b));
        // find max of sublist
        int maxOfSub = numbers.subList(fromIndex, toIndex).stream().max(Integer::compareTo).get();
        //update indexes
        fromIndex = map.getOrDefault(maxOfSub,toIndex-1) + 2;
        toIndex += fromIndex;

        if (maxOfSub > 0)
            result.add(maxOfSub);
    }
    int lastMax = numbers.subList(fromIndex, numbers.size()).stream().max(Integer::compareTo).get();
    if (lastMax > 0)
        result.add(lastMax);
    System.out.println(result);
    System.out.println(result.stream().reduce(0, Integer::sum));