當(dāng)前位置:
首頁(yè) >
动态规划学习笔记3
發(fā)布時(shí)間:2023/11/30
40
豆豆
某工廠預(yù)計(jì)明年有A、B、C、D四個(gè)新建項(xiàng)目,每個(gè)項(xiàng)目的投資額Wk及其投資后的收益Vk如下表所示,投資總額為30萬元,如何選擇項(xiàng)目才能使總收益最大?
| Project | Wk | Vk |
| A | 15 | 12 |
| B | 10 | 8 |
| C | 12 | 9 |
| D | 8 | 5 |
聲明一個(gè) 二維數(shù)組
m[ i ][ j ] 表示 在面對(duì)第 i 件物品,且背包容量為 j 時(shí)所能獲得的最大價(jià)值
j < w[i]
這時(shí)候背包容量不足以放下第 i 件物品,只能選擇不拿
m[ i ][ j ] = m[ i-1 ][ j ]
j>=w[i]
這時(shí)背包容量可以放下第 i 件物品,我們就要考慮拿這件物品是否能獲取更大的價(jià)值。
如果拿取
m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]
這里的m[ i-1 ][ j-w[ i ] ]指的就是考慮了i-1件物品,背包容量為j-w[i]時(shí)的最大價(jià)值,也是相當(dāng)于為第i件物品騰出了w[i]的空間。
如果不拿
m[ i ][ j ] = m[ i-1 ][ j ]
for (int i = 1; i <= n; i++){for (int j = 1; j <= c; j++){if (j >= w[i])m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i]);elsem[i][j] = m[i - 1][j];}}完整代碼
#include <iostream> #include <cstring> #include <algorithm>using namespace std;int main() {int v[7] = { 0,8,10,6,3,7,2 };int w[7] = { 0,4,6,2,2,5,1 };int m[100][100];int n = 6, c = 12;memset(m, 0, sizeof(m));for (int i = 1; i <= n; i++){for (int j = 1; j <= c; j++){if (j >= w[i])m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i]);elsem[i][j] = m[i - 1][j];}}for (int i = 1; i <= n; i++){for (int j = 1; j <= c; j++)cout << m[i][j] << ' ';cout << endl;}return 0; }總結(jié)
- 上一篇: 如何动态的在所有页面里加载html
- 下一篇: 二叉树的层序遍历,前序遍历(递归,非递归