Description
背包问题是指有N件物品和一个容量为W的背包。第i件物品的价值是v,需要占用的容量是w。
求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
而0-1背包问题是指可选择的物品每种仅有一件,可以选择不装入某物品,即0;或选择装入某物品,即1
Input
输入有行,第一行为正整数N,代表有N件物品可选;第二行为正整数W,代表背包容量
第3行为N个数,分别代表第1到N个物品的价值v,以空格隔开
第4行为N个整数,分别代表第1到N个物品需要占用的容量w,以空格隔开
例如:
5
15
4 2 1 2 6
12 2 1 1 4
Output
输出为根据输入条件能装入的最大价值,比如对于上面输入描述中的数据,应输出
11
Sample Input 1
5 15 4 2 6 2 8 12 1 1 1 4
Sample Output 1
18
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;//n表示物品的个数,m表示背包的容量
vector<int> value(n+1,0); //存放n个物品的价值
vector<int> volume(n+1,0); //存放n个物品所需的体积
vector<vector<int> > f(n+1,vector<int> (m+1,0));//f[i][j],存放j体积下前i个物品的最大价值
for(int i = 1; i <= n; i ++) cin >> value[i];//输入每个物品的价值
for(int i = 1; i <= n; i ++) cin >> volume[i];
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
if(j < volume[i]) f[i][j] = f[i-1][j];//由于当前背包的容量不足以放第i个物品,所以价值与装i-1个相同
else f[i][j] = max(f[i-1][j],f[i-1][j-volume[i]] + value[i]);
//这时候能装,但是需要在装与不装之间选择最大的
}
cout << f[n][m];
return 0;
}