背包问题--01背包
一、关于01背包
dp[i][j]:前i件商品在背包容量为j的条件下可以装入的最大价值;
dp[i][j]=dp[i-1][j]:第i件商品不装入背包;
dp[i][j]=dp[i-1][j-w[i]]+p[i]:第i件商品装入背包
所以递推式为:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+p[i])
二、01背包原始问题
题目:给定5件商品的价值和重量分别为{ 10,3,4,5,4 }、{ 24,2,9,10,9 },背包容量为13;
#include<iostream>
using namespace std;
int main() {
int v[6] = { 0,10,3,4,5,4 };
int p[6] = { 0,24,2,9,10,9 };
int i = 5, c = 13;
int dp[6][14];
int rec[6][14] = { 0 }; //每行代表一个物品
for (int j = 0; j <= i; j++) {
for (int k = 0; k <= c; k++) {
if (j == 0 || k == 0)
dp[j][k] = 0;
else if (k - v[j] >= 0) {
int m1, m2;
m1 = dp[j - 1][k];
m2 = dp[j - 1][k - v[j]] + p[j];
if (m1 < m2) {
dp[j][k] = m2;
rec[j][k] = 1;
}
else
dp[j][k] = m1;
}
else
dp[j][k] = dp[j - 1][k];
}
}
cout << dp[5][13] << endl;
cout << "选了:";
for (int j = i, k = c; j > 0 && k > 0;) { //用&&
if (rec[j][k] == 1) { //选了
cout << j << ' ';
j--;
k -= v[j];
}
else //没选
j--;
}
return 0;
}
输出:
该问题可以通过键盘输入商品信息及背包容量的大小,后面有时间会进行修改。
并且,01背包问题可以通过滚动数组进行优化,后面会在题目中使用。