问题描述
现有4个物品,小偷背包总容量为8,怎么可以偷得价值最多的物品?
物品编号:1 2 3 4
物品重量:2 3 4 5
物品价值:3 4 5 8
输入
4 8
2 3 4 5
3 4 5 8
输出
12
#include<iostream>
using namespace std;
const int N=100;
int w[N],v[N];
int f[N][N];//f[i][j] :可以偷前i件物品,在背包容量为j的前提下所能偷到的最大价值
int n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
}
for(int i=1;i<=n;i++){
cin>>v[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j<w[i]){
f[i][j]=f[i-1][j];//太重,偷不了
}else{
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
}
}
}
cout<<f[n][m]<<endl;
return 0;
}
思路:在面临第i件物品时,可以选择不偷:f[i-1][j],也可以选择偷:f[i-1][j-w[i]]+v[i],取两者的最大值即为f[i][j]的值。