#P3008. 最大花费金额(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 206
            Accepted: 69
            Difficulty: 5
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>暴力枚举          
 
最大花费金额(100分)
题面描述
双十一期间,众多商品进行打折销售。小明想购买自己心仪的一些物品,但由于受购买资金限制,他决定从众多心仪商品中购买三件,并尽可能地花完资金。
请设计一个程序,帮助小明计算尽可能花费的最大资金数额。
思路
- 
组合枚举:由于需要从数组中选择三件商品,最直接的方法是枚举所有可能的三元组组合,计算其总和,并找到小于或等于
R的最大值。 - 
优化:
- 排序后,可以通过双指针法减少一些不必要的组合计算。
 - 由于数组长度小于 
100,三重循环的时间复杂度O(n^3)在此范围内是可接受的,不需要进一步优化。 
 - 
边界条件:
- 如果数组长度小于 
3,直接返回-1。 - 检查所有可能的三元组,如果没有符合条件的组合,返回 
-1。 
 - 如果数组长度小于 
 
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
    // 读取商品价格字符串
    string prices_str;
    getline(cin, prices_str);
    // 读取资金额度
    string R_str;
    getline(cin, R_str);
    
    // 分割商品价格并转换为整数
    vector<int> M;
    string num;
    for(char c : prices_str){
        if(c == ',') {
            if(!num.empty()){
                M.push_back(stoi(num));
                num.clear();
            }
        }
        else {
            num += c;
        }
    }
    if(!num.empty()){
        M.push_back(stoi(num));
    }
    
    // 转换资金额度为整数
    int R = stoi(R_str);
    
    int n = M.size();
    if(n < 3){
        // 如果商品数量不足三件,输出-1
        cout << "-1";
        return 0;
    }
    
    int max_sum = -1;
    
    // 枚举所有三元组组合
    for(int i = 0; i < n-2; ++i){
        for(int j = i+1; j < n-1; ++j){
            for(int k = j+1; k < n; ++k){
                int current_sum = M[i] + M[j] + M[k];
                if(current_sum <= R && current_sum > max_sum){
                    max_sum = current_sum;
                }
            }
        }
    }
    
    // 输出结果
    cout << max_sum;
}
python
# 读取商品价格字符串
prices_str = input().strip()
# 读取资金额度
R_str = input().strip()
# 分割商品价格并转换为整数
M = list(map(int, prices_str.split(',')))
# 转换资金额度为整数
R = int(R_str)
n = len(M)
if n < 3:
    # 如果商品数量不足三件,输出-1
    print(-1)
else:
    max_sum = -1
    # 枚举所有三元组组合
    for i in range(n-2):
        for j in range(i+1, n-1):
            for k in range(j+1, n):
                current_sum = M[i] + M[j] + M[k]
                if current_sum <= R and current_sum > max_sum:
                    max_sum = current_sum
    # 输出结果
    print(max_sum)
java
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        // 读取商品价格字符串
        String prices_str = sc.nextLine();
        // 读取资金额度
        String R_str = sc.nextLine();
        
        // 分割商品价格并转换为整数
        String[] parts = prices_str.split(",");
        int[] M = new int[parts.length];
        for(int i=0;i<parts.length;i++){
            M[i] = Integer.parseInt(parts[i]);
        }
        
        // 转换资金额度为整数
        int R = Integer.parseInt(R_str);
        
        int n = M.length;
        if(n < 3){
            // 如果商品数量不足三件,输出-1
            System.out.println("-1");
            return;
        }
        
        int max_sum = -1;
        // 枚举所有三元组组合
        for(int i=0;i<n-2;i++){
            for(int j=i+1;j<n-1;j++){
                for(int k=j+1;k<n;k++){
                    int current_sum = M[i] + M[j] + M[k];
                    if(current_sum <= R && current_sum > max_sum){
                        max_sum = current_sum;
                    }
                }
            }
        }
        // 输出结果
        System.out.println(max_sum);
    }
}
        题目描述
双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金。
现在请你设计一个程序帮助小明计算尽可能花费的最大资金数额。
输入描述
输入第一行为一维整型数组M,数组长度小于 100 ,数组元素记录单个商品的价格,单个商品价格小于 1000。
输入第二行为购买资金的额度 R , R 小于 100000。
输入格式是正确的,无需考虑格式错误的情况。
输出描述
输出为满足上述条件的最大花费额度。
如果不存在满足上述条件的商品,请返回 −1 。
样例1
输入
23,26,36,27
78
输出
76
说明
金额 23 、26 和 27 相加得到 76 ,而且最接近且小于输入金额 78 。
样例1
输入
23,30,40
26
输出
-1
说明
因为输入的商品,无法组合出来满足三件之和小于 26.故返回 −1 。