1.问题描述
在M件物品中取出若干件放在空间为W的背包里,每件物品的体积为W1,W2,...Wm ,与之对应的价值为P1,P2,.....Pn
2.算法描述
2.1 递归 (复杂度O(2^n))
function make(i,j)
if i==0
return 0
if j>=wi
r1=make(i-1,j-wi)+wi //放第i件物品
r2=make(i-1,j) //不放第i件物品
return max(r1,r2)
2.2 DP (复杂度O(w*m))
function make;
for i =0 to w
f[0,i]=0;
for i=1 to m
for j=0 to w
f[i,j]=f[i-1,j]
if j>=wi and f[i-1,j-wi]+wi>f[i,j]
f[i,j]=f[i-1,j-wi]+wi
return f[i,j]
3.应用
//给定数组vector<int> src,和一个上限Q,求src不大于Q的最大和
//01背包问题
int maxAdd01(const vector<int>& s, int Q)
{
vector<vector<int> > res;
//初始化
for (int i = 0; i <= s.size(); ++i)
{
vector<int> tmp;
for (int j = 0; j <= Q; ++j)
{
tmp.push_back(0);
}
res.push_back(tmp);
tmp.clear();
}
for (int i =1; i <= s.size(); ++i)
{
for (int j = 0; j <= Q; ++j)
{
res[i][j] = res[i - 1][j]; //不放第i件
if (j >= s[i - 1] && (res[i - 1][j - s[i - 1]] + s[i - 1] > res[i][j]))
res[i][j] = res[i - 1][j - s[i - 1]] + s[i - 1]; //放第i件
}
}
int result = res[s.size()][Q];
res.clear();
return result;
}