0-1背包

/*
0-1背包问题
状态表示:
f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少
result=max{f[n][0~v]}

1 不选第i个物品,f[i][j] = f[i-1][j];
2 选第i个物品,f[i][j] = f[i-1][j-v[i]];

f[i][j] = max(1,2);

f[0][0]=0;初始化
*/

#include
#include
#include
using namespace std;

const int N = 1010;
int n, m;//n表示物品个数,m表示总共可用的背包容量
int f[N][N];
int v[N], w[N];//记录每个物品的重量和价值,重量用v表示,价值用w表示

int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> v[i] >> w[i];

for (int i = 1; i <= n; i++)//循环物品
for (int j = 0; j <= m; j++)//枚举所有重量
{
f[i][j] = f[i - 1][j];//不选第i物品
if (j >= v[i])//j表示剩余重量,v[i]表示第i物品重量
f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);//选第i物品
}

int res = 0;
for (int i = 0; i <= m; i++) res = max(res, f[n][i]);
cout << res << endl;
system("pause");//防止程序退出
return 0;

}

你可能感兴趣的:(0-1背包)