练习地址:2. 01背包问题 - AcWing题库
思路:本题是经典的01背包问题,这里使用的是优化过后的写法.由于使用的是一维数组,为了避免上一层的状态被覆盖,所以只能在背包容积循环这一层逆向循环
c++代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int v[N],w[N]; //记录每一个物品的体积,价值
int f[N];
int n,W;
int main(){
cin>>n>>W;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i]; //输入每一个物品的体积,价值
}
for(int i=1;i<=n;i++){ //外层是物品的循环,从第一个物品开始
for(int j=W;j>=0;j--){ //内层是容积的循环,从大到小逆序
if(v[i]<=j){ //如果当前物品可以放入当前容积
f[j]=max(f[j-v[i]]+w[i],f[j]); //比较一下放不放入这个物品哪一个所获得价值更大
}
}
}
cout<<f[W];
}