题目描述

双十一众多商品进行打折销售,小明想购买一些自己心仪的商品,但由于受购买资金限制,所以他决定从众多心意商品中购买3件,而且想尽可能的花完资金,现在请你设计一个程序帮助小明计算尽可能花费的最大资金额。

输入描述

第一行为整型数组M,数组长度小于100,数组元素记录单个商品的价格;

单个商品价格小于1000;

第二行输入为购买资金的额度R;

R < 100000。

输出描述

输出为满足上述条件的最大花费额度

如果不存在满足上述条件的商品请返回-1

示例一

输入:

23,26,36,27

78

输出:

76

示例二

输入:

23,30,40

26

输出:

-1

Java代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
  private static final List<List<Integer>> combines = new ArrayList<>();
  private static final List<Integer> combine = new ArrayList<>(3);
  private static int res = -1;

  public static void main(String[] args) {
    try (Scanner scanner = new Scanner(System.in)) {
      String m = scanner.nextLine();
      int r = scanner.nextInt();
      solution(m, r);
    }
  }

  private static void solution(String m, int r) {

    String[] goodsPricesString = m.split(",");
    int[] goodsPrices = new int[goodsPricesString.length];
    for (int i = 0; i < goodsPricesString.length; i++) {
      goodsPrices[i] = Integer.parseInt(goodsPricesString[i]);
    }
    Arrays.sort(goodsPrices);
    if (goodsPrices.length < 3 ||
        goodsPrices[0] + goodsPrices[1] + goodsPrices[2] > r) {
      System.out.println(-1);
      return;
    }

    takeGoods(goodsPrices, 0);
    combines.stream()
        .map(list -> sum(list))
        .sorted(Integer::compareTo)
        .forEach(sum -> {
          if (sum > res && sum <= r) {
            res = sum;
          }
        });

    System.out.println(res);

  }

  private static void takeGoods(int[] goodsPrices, int start) {
    if (combine.size() == 3) {
      combines.add(new ArrayList<>(combine));
      return;
    }
    for (int i = start; i < goodsPrices.length; i++) {
      combine.add(goodsPrices[i]);
      takeGoods(goodsPrices, i + 1);
      combine.remove(combine.size() - 1);
    }
  }

  private static Integer sum(List<Integer> prices) {
    int sum = 0;
    for (Integer i : prices) {
      sum += i;
    }
    return sum;
  }
}
最后修改日期: 2023年6月2日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。