動態規劃求解投資問題

2021-10-06 11:12:11 字數 1385 閱讀 9862

問題

設 m 元錢,n 項投資,函式f(x)表示將 x 元投入第 i 項專案所產生的效益,i=1,2,…,n.

問:如何分配這m元錢,使得投資的總效益最高?

解析可以設dp[i][j],cost[i][j]陣列,dp代表花費j元投資前i項的所獲取的最優效益,cost代表dp[i][j]情況在第i專案上花費的金額,從而可以推出dp方程,dp[i][j]=max(dp[i-1][j-x]+f[i][x]),其中f[i][x]代表第i項投資x元,進一步確定邊界條件dp[i][0]=0,dp[1][j]=f[1][j],所以遍歷n個專案,m元錢,每個當前專案投入的金額即可得出結果

設計

for (int i = 0; i <= m; i++) 

for (int i = 2; i <= n; i++)

for (int j = 1; j <= m; j++)

for (int k = 0; k <= j; k++)

else if (dp[i][j] == dp[i - 1][j - k] + f[i][k])

cost[i][j] = min(cost[i][j], k);

}

原始碼

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

int main()

,,,, };

for (int i = 0; i <= m; i++)

for (int i = 2; i <= n; i++)

for (int j = 1; j <= m; j++ )

for (int k = 0; k <= j; k++)

else if (dp[i][j] == dp[i - 1][j - k] + f[i][k])

cost[i][j] = min(cost[i][j], k);

}printf("dp:\n");

for (int i = 0; i <= m; i++)

for (int j = 1; j <= n; j++)

printf("%4d%c", dp[j][i], " \n"[j == n]);

printf("\ncost:\n");

for (int i = 0; i <= m; i++)

for (int j = 1; j <= n; j++)

printf("%4d%c", cost[j][i], " \n"[j == n]);

printf("\n最大利潤:%d\n", dp[n][m]);

while (m)

return 0;

}

動態規劃 投資問題

要求 現有x萬元資金可以投資給m個專案,先給出三個專案分別投資0 x萬元可得的利益,其求出如何分配這x萬元可以使得得到的利益最大化。本題以投資金額為7萬元資金以及a b c三個專案為例 解題思路 這道題目是分成的專案是三個,所以可以將整個解題思路分為三個階段。第一階段 只考慮a乙個專案,即將所有的資...

投資問題 動態規劃問題

動態規劃 是一種多階段決策過程最優的通用方法 優化原則 乙個最優決策序列的任何子串行本身一定是相對於子串行的初始和結束狀態的最優決策序列 我的理解是 假設s3a3b4c4t4 最優化的未知 是最優化的,即是 所有的s中某點 到 所有的t中某點 最短的選擇路徑 按照優化原則,即是s3a3b4ct4中任...

動態規劃之投資問題

1 問題描述 有m元錢,n項投資,f i x 代表將x元投入到第i個專案中的收益,求最大的收益。2 輸入 第一行為總錢數m和總專案數n 接下來為n行輸入,每行m個,代表f i x 3 輸出 最大收益 4 解析 動態規劃問題一般分為兩類 中間狀態類和累積狀態類。前者的引數是相同的,後者的引數不同,而且...