2024华为OD试题及答案-A059-最大利润

题目描述

商人经营一家店铺,有number种商品,
由于仓库限制每件商品的最大持有数量是item[index]
每种商品的价格是item-price[item_index][day]
通过对商品的买进和卖出获取利润
请给出商人在days天内能获取的最大的利润
注:同一件商品可以反复买进和卖出

输入描述

第一行输入商品的数量number,比如3
第二行输入商品售货天数 days,比如3
第三行输入仓库限制每件商品的最大持有数量是item[index],比如4 5 6

后面继续输入number行days列,含义如下:
第一件商品每天的价格,比如1 2 3
第二件商品每天的价格,比如4 3 2
第三件商品每天的价格,比如1 5 3

输出描述

输出商人在这段时间内的最大利润。

用例
输入3
3
4 5 6
1 2 3
4 3 2
1 5 2
输出32
说明

问题分析

输入

  1. 一个整数 number 表示商品种类数。
  2. 一个整数 days 表示商品售卖天数。
  3. 一个包含 number 个整数的列表,表示每种商品的仓库限制。
  4. 接下来有 number 行,每行包含 days 个整数,表示每种商品每天的价格。

输出

  • 在这段时间内可以获得的最大利润。

处理步骤

  1. 初始化
    • 读取商品种类数、售卖天数、仓库限制以及每天的价格。
  2. 动态规划
    • 创建一个二维数组 dp,其中 dp[i][j] 表示第 i 天售出商品 j 种的最大利润。
    • 初始化第一天的利润为价格乘以仓库限制。
    • 对于后续的天数,更新 dp 数组,计算每一天每种商品的最大利润。
  3. 计算最大利润
    • 遍历 dp 数组最后一天的值,找到最大利润。

解题思路

  1. 读取输入数据:包括商品种类数、售卖天数、仓库限制和每天的价格。
  2. 初始化dp数组:大小为 days x number,用于存储每天的最大利润。
  3. 动态规划计算利润
    • 第一天的利润为 dp[0][j] = price[0][j] * limit[j]
    • 后续天数的利润为 dp[i][j] = max(dp[i-1][k] + price[i][j] * limit[j])
  4. 输出最大利润:遍历 dp 数组的最后一天,输出最大值。

C++实现

 
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int number, days;
    cin >> number >> days;

    vector<int> limits(number);
    for (int i = 0; i < number; ++i) {
        cin >> limits[i];
    }

    vector<vector<int>> prices(number, vector<int>(days));
    for (int i = 0; i < number; ++i) {
        for (int j = 0; j < days; ++j) {
            cin >> prices[i][j];
        }
    }

    vector<int> dp(number, 0);

    for (int i = 0; i < number; ++i) {
        dp[i] = prices[i][0] * limits[i];
    }

    for (int d = 1; d < days; ++d) {
        vector<int> new_dp(number, 0);
        for (int i = 0; i < number; ++i) {
            for (int j = 0; j < number; ++j) {
                new_dp[i] = max(new_dp[i], dp[j] + prices[i][d] * limits[i]);
            }
        }
        dp = new_dp;
    }

    int max_profit = *max_element(dp.begin(), dp.end());
    cout << max_profit << endl;

    return 0;
}

Python实现

 
def main():
    import sys
    input = sys.stdin.read
    data = input().split()

    idx = 0

    number = int(data[idx])
    idx += 1
    days = int(data[idx])
    idx += 1

    limits = [int(data[idx + i]) for i in range(number)]
    idx += number

    prices = []
    for i in range(number):
        prices.append([int(data[idx + j]) for j in range(days)])
        idx += days

    dp = [prices[i][0] * limits[i] for i in range(number)]

    for d in range(1, days):
        new_dp = [0] * number
        for i in range(number):
            for j in range(number):
                new_dp[i] = max(new_dp[i], dp[j] + prices[i][d] * limits[i])
        dp = new_dp

    max_profit = max(dp)
    print(max_profit)

if __name__ == "__main__":
    main()

使用说明

  • 将上述C++代码保存为max_profit.cpp,然后使用命令行编译和运行:

     
    g++ max_profit.cpp -o max_profit
    ./max_profit
    

    输入商品种类数、售卖天数、仓库限制和每天的价格,并按回车键查看输出。

  • 将上述Python代码保存为max_profit.py,然后使用命令行运行:

     
    python max_profit.py
    

    输入商品种类数、售卖天数、仓库限制和每天的价格,并按回车键查看输出。

这两个程序将会读取输入的数据,计算并输出在指定时间内可以获得的最大利润。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值