题目描述
商人经营一家店铺,有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 |
说明 | 无 |
问题分析
输入
- 一个整数
number
表示商品种类数。 - 一个整数
days
表示商品售卖天数。 - 一个包含
number
个整数的列表,表示每种商品的仓库限制。 - 接下来有
number
行,每行包含days
个整数,表示每种商品每天的价格。
输出
- 在这段时间内可以获得的最大利润。
处理步骤
- 初始化:
- 读取商品种类数、售卖天数、仓库限制以及每天的价格。
- 动态规划:
- 创建一个二维数组
dp
,其中dp[i][j]
表示第i
天售出商品j
种的最大利润。 - 初始化第一天的利润为价格乘以仓库限制。
- 对于后续的天数,更新
dp
数组,计算每一天每种商品的最大利润。
- 创建一个二维数组
- 计算最大利润:
- 遍历
dp
数组最后一天的值,找到最大利润。
- 遍历
解题思路
- 读取输入数据:包括商品种类数、售卖天数、仓库限制和每天的价格。
- 初始化
dp
数组:大小为days
xnumber
,用于存储每天的最大利润。 - 动态规划计算利润:
- 第一天的利润为
dp[0][j] = price[0][j] * limit[j]
。 - 后续天数的利润为
dp[i][j] = max(dp[i-1][k] + price[i][j] * limit[j])
。
- 第一天的利润为
- 输出最大利润:遍历
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
输入商品种类数、售卖天数、仓库限制和每天的价格,并按回车键查看输出。
这两个程序将会读取输入的数据,计算并输出在指定时间内可以获得的最大利润。