mirror of
https://github.com/SunnyQjm/algorithm-review.git
synced 2026-06-03 08:16:43 +08:00
58 lines
2.6 KiB
Python
58 lines
2.6 KiB
Python
#!/usr/bin/env python
|
|
# coding=utf-8
|
|
|
|
#######################################################################################
|
|
# 投资问题
|
|
#
|
|
# 设有m元钱,n项投资,函数 fi(x) 表示将x元钱投入到第 i 项项目所产生
|
|
# 的效益,i=1,…, n. 问:如何分配这m元钱,使得投资的总效益最高?
|
|
#######################################################################################
|
|
|
|
|
|
class Solution:
|
|
def investmentProblem(self, f, m):
|
|
"""
|
|
:type f: List[List[int]]
|
|
:type m: int
|
|
:rtype int
|
|
|
|
思路:
|
|
1. 采用动态规划的思路解;
|
|
2. 定义状态:dp[i][j] => 表示前i个项目投资j元所能获得的最大收益;
|
|
3. base case => dp[0][...]和dp[...][0]均为0,表示没有项目或者投资金额为0时,收益自然为0;
|
|
4. 状态转移方程:
|
|
F(i, j) = f(i, j) i == 1 => 当只投资一个项目时,直接返回投资j元到该项目的收益即为总收益
|
|
= max(0 <= k <= j){F(i - 1, j - k) + f(i, k)} i > 1 => 前i个项目投资j元的总收益可以化解为以下子问题:
|
|
- 前i - 1个项目投资0元,第i个项目投资j元;
|
|
- 前i - 1个项目投资1元,第i个项目投资j - 1元;
|
|
- ...
|
|
- 前i - 1个项目投资j元,第i个项目投资0元;
|
|
取上述所有子问题的最大的值即可。
|
|
"""
|
|
# 获取项目的个数
|
|
num = len(f)
|
|
dp = [[0] * (m + 1) for i in range(num + 1)]
|
|
|
|
# 处理i==1,即只投资一个项目的情况
|
|
for j in range(1, m + 1):
|
|
dp[1][j] = f[0][j]
|
|
|
|
for i in range(2, num + 1):
|
|
for j in range(1, m + 1):
|
|
for k in range(j):
|
|
dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + f[i - 1][k])
|
|
return dp[-1][-1]
|
|
|
|
|
|
if __name__ == '__main__':
|
|
solution = Solution()
|
|
print(solution.investmentProblem(
|
|
[
|
|
[0, 11, 12, 13, 14, 15],
|
|
[0, 0, 5, 10, 15, 20],
|
|
[0, 2, 10, 30, 32, 40],
|
|
[0, 20, 21, 22, 23, 24]
|
|
],
|
|
5
|
|
), "= 61")
|