1 問題描述ios
有N個商品,每一個商品的體積是c[j], j = 1, 2, 3, .., N,每一個商品的價值是v[j], j = 1, 2, ..., N.如今有一個揹包,體積是C,如今要求往包裏面裝商品,使得在裝得下的狀況下,整包商品的價值最大。編程
2 問題求解的思路ci
2.1 子問題提取和描述it
v[i, c], 當取的商品是{0, 1, 2, 3, ..., i}的子集,最大致積是c時的最大商品總價值。原問題是,當商品是{1,2,3,...,N}的子集,最大致積是C時的商品的最大總價值,這裏縮小了可選擇的商品和容量的可選空間,提取子問題,可見這個子問題和原問題是同構的。io
2.2 遞推關係提取stream
初始值:gc
v[0, c] = 0co
v[i, c] = -∞, c<0,這個時候方案是不存在的。return
遞推關係:
分紅兩類,選擇i和不選擇i。
不選擇i,商品的最大總價值是v[i-1, c];
選擇i時,商品的最大總價值是v[i] + v[i-1, c-c[i]]
所以
v[i, c] = max{v[i-1, c], v[i] + v[i-1, c-c[i]]}
2.3 列表求解
例子:c[j] = {3, 5, 2, 7, 4}, v[j] = {2, 4, 1, 6, 5}
v[i, c] c = 0 1 2 3 4 5 6 7 8 9 10
i = 0 0 0 0 0 0 0 0 0 0 0 0
i = 1 0 0 0 2 2 2 2 2 2 2 2
i = 2 0 0 0 2 2 4 4 4 6 6 6
i = 3 0 0 1 2 2 4 4 5 6 6 7
i = 4 0 0 1 2 2 4 4 6 6 7 8
i = 5 0 0 1 2 5 5 6 7 7 9 9
因此,商品的最大價值是9。
3 編程實現
#include <iostream>int max(int a, int b){ if (a > b) { return a; } else { return b; }}int main(int argc, char* argv[]){ int capacity[5] = {3, 5, 2, 7, 4}; int value[5] = {2, 4, 1, 6, 5}; int V[6][11] = {0}; for(int i = 1; i < 6; i++) { for (int j = 1; j < 11; j++) { if ((j - capacity[i]) < 0) { V[i][j] = V[i-1][j]; } else { V[i][j] = max(V[i-1][j], V[i-1][j - capacity[i]] + value[i]); } } } std::cout<<"the max is:"<<V[5][10]<<std::endl;}