有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
代码
#include <iostream>
using namespace std;
int f[1005];//全局变量默认初始化为0
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int v,w;
cin>>v>>w;//输入每个物品的体积
for(int j=m;j>=v;j--){//01背包从大到小枚举、完全背包从小到大枚举
f[j]=max(f[j],f[j-v]+w);//取f[j]不选第i个物品、f[j-v]+w选第i个物品这两种情况的最大值
}
}
//因为最大价值的选法的体积可能是1-m中的任何一个,设其为k,则f[m-k]=0的那个初始条件一定可以以同样的选法转移到f[m]上,所以f[m]就是最大价值
cout<<f[m]<<endl;//f[i]都初始化为0,求的是体积小于等于m的最大价值,初始化f[0]=0,f[i]=-∞求的是体积恰好为m的最大价值
return 0;
}