01背包问题
有N件物品和一个容量为V的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,装入的物品总值最大。
动态规划是不断决策求最优解的过程,0-1背包即是不断对第i个物品的做决策,0-1正好代表不选与选的两种决定。
二维版:
状态f[i][j]:前i个物品,背包容量j下的最优解
当前状态依赖之前的状态
当前背包容量不够时,没得选,因此前i个物品最优解即为前i-1个物品的最优解
当前背包容量够,可以选,因此需要决策选与不选第i个物品
选:f[i][j]=f[i-1][j-v[i]+w[i]]
不选:f[i][j]=f[i-1][j]
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int v[N];//体积
int w[N];//价值
int f[N][N];//f[i][j],j体积下前i个物品的最大价值
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(j<v[i]) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
}
cout<<f[n][m]<<endl;
return 0;
}