最大花费金额
难度:★
直接暴力三重for循环
最大花费金额
知识点数组
时间限制:1s 空间限制:32MB 限定语言:不限
题目描述:
双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金,现在请你设计一个程序帮助小明计算尽可能花费的最大资金数额。
输入描述:
输入第一行为一维整型数组M,数组长度小于100,数组元素记录单个商品的价格,单个商品价格小于1000。
输入第二行为购买资金的额度R,R小于100000。
输出描述:
输出为满足上述条件的最大花费额度。
注意:如果不存在满足上述条件的商品,请返回-1。
补充说明:
输入格式是正确的,无需考虑格式错误的情况。
示例1
输入:
23,26,36,27
78
输出:
76
说明:
金额23、26和27相加得到76,而且最接近且小于输入金额78
示例2
输入:
23,30,40
26
输出:
-1
说明:
因为输入的商品,无法组合出来满足三件之和小于26.故返回-1
解题思路:
遍历所有可能的商品组合,计算价格之和并比较与购买资金额度的差值,从而找到满足条件的最大花费额度。
JAVA代码:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String[] str = scan.nextLine().split(","); // 输入商品价格数组
int money = scan.nextInt(); // 输入购买资金额度
scan.close();
int nums[] = new int[str.length];
for (int i = 0; i < str.length; i++) {
nums[i] = Integer.parseInt(str[i]);
}
int res = money; // 记录最大花费额度的初始值为购买资金额度
for (int i = 0; i < str.length - 2; i++) { // 遍历商品价格数组,选择三种商品的组合
if (nums[i] >= money) {
continue; // 如果当前商品价格大于等于购买资金额度,跳过当前循环
}
for (int j = i + 1; j < str.length - 1; j++) {
int temp1 = nums[i] + nums[j]; // 计算前两种商品价格之和
if (temp1 >= money) {
continue; // 如果前两种商品价格之和大于等于购买资金额度,跳过当前循环
}
for (int k = j + 1; k < str.length; k++) {
int temp2 = temp1 + nums[k]; // 计算三种商品价格之和
if (temp2 > money) {
continue; // 如果三种商品价格之和大于购买资金额度,跳过当前循环
}
res = Math.min(res, money - temp2); // 更新最大花费额度
}
}
}
if (res == money) {
System.out.println(-1); // 如果无法满足条件的商品组合,输出-1
} else {
System.out.println(money - res); // 输出满足条件的最大花费额度
}
}
代码说明:
代码思路和实现说明如下:
- 从输入中获取商品价格数组和购买资金额度。
- 将商品价格数组转换为整数数组。
- 初始化最大花费额度
res
为购买资金额度。 - 使用三重循环遍历商品价格数组,选择三种商品的组合。
- 如果当前商品价格大于等于购买资金额度,则跳过当前循环。
- 计算三种商品价格之和,并与购买资金额度进行比较。
- 如果三种商品价格之和大于购买资金额度,则跳过当前循环。
- 更新最大花费额度
res
,取购买资金额度与三种商品价格之和的差的最小值。 - 判断是否存在满足条件的商品组合。
- 如果不存在满足条件的商品组合,输出-1。
- 如果存在满足条件的商品组合,输出满足条件的最大花费额度。