1.什么是背包问题:
背包问题指这样一类问题,题意往往可以抽象成:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
2. 0-1背包问题:
有 N件物品和一个容量是 V的背包。每件物品只能使用一次。
第 i件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤10000
0<vi,wi≤1000
输入样例
4 5 1 2 2 4 3 4 4 5
输出样例:
8
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];//v 保存体积,w 保存价值
int f[N][N];//保存所有集合最值状态
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
cin >> v[i] >> w[i];
for(int i = 0; i <= m; i++)//初始化,前 0 中物品中选择
{
f[0][i] = 0;
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= m; j ++)
{
if(v[i] <= j)//能放入第 i 件物品的情况下,求f[i][j]
f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
else//不能放入第 i 件物品的情况下,求f[i][j]
f[i][j] = f[i - 1][j];
}
}
cout << f[n][m] << endl;//f[n][m] 就是答案
return 0;
}