背包指一类在有限制的条件下选取一些物品使物品总价值最大的问题。
每个物品有其价值 v[i] 代价 w[i] ,可承受的最大代价为 W。
背包问题的解题方法大致就是考虑选与不选两种情况哪种最优。
01背包
01背包顾名思义就是每种物品自由选(1)不选(0)两种情况。
状态设置:
f[i][j]表示在前i个物品中花了j的代价所取得的最大价值。
转移方程:
f[i-1][j]表示不取第i个物品。
f[i-1][j-w[i]]+v[i]表示取第i个物品。
显然 f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])
标程 P1048采药:
完全的模板,没什么好说的。
#include<bits/stdc++.h> using namespace std; int W,n,m,v[1001],w[1001],f[1001][1001]; int main() { cin>>W>>n; for(int i=1;i<=n;i++) cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=0;j<=W;j++) { if(j<w[i]) f[i][j]=f[i-1][j]; else f[i][j]=max(f[i-1][j-w[i]]+v[i],f[i-1][j]); } } cout<<f[n][W]; return 0; }