某工廠預計明年有A、B、C、D四個新建項目,每個項目的投資額Wk及其投資后的收益Vk如下表所示,投資總額為30萬元,如何選擇項目才能使總收益最大?
Project | Wk | Vk |
A | 15 | 12 |
B | 10 | 8 |
C | 12 | 9 |
D | 8 | 5 |
聲明一個 二維數組
m[ i ][ j ] 表示 在面對第 i 件物品,且背包容量為 j 時所能獲得的最大價值
j < w[i]
這時候背包容量不足以放下第 i 件物品,只能選擇不拿
m[ i ][ j ] = m[ i-1 ][ j ]
j>=w[i]
這時背包容量可以放下第 i 件物品,我們就要考慮拿這件物品是否能獲取更大的價值。
如果拿取
m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]
這里的m[ i-1 ][ j-w[ i ] ]指的就是考慮了i-1件物品,背包容量為j-w[i]時的最大價值,也是相當于為第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;
}