算法温习动态规划之01背包问题
01背包问题不再详述,百度之。
先给出01背包的递推式如下:
f[i][j]:表示把前i个物品放入承重为j的背包中得到的最大价值。
f[i][j]=max((f[i-1][j-w[i]+p[i]),f[i-1][j]) (j>=w[i])
f[i][j]=f[i-1][j] (j<w[i])
其实就是讨论第i个物品放不放入背包中,两种情况,看哪中情况得到的价值大
第一种情况:f[i-1][j-w[i]]+p[i] 表示把第i个物品放入背包中,那么该背包的价值增加p[i],但是,由于放入了w[i]的重物,背包承重能力减少w[i],该问题显然可以用递归解决,自顶向下,(我们看这个递归是的时候用自顶向下的眼光看,比较容易理解,如果从下往上推导,有点难理解)也更简单。
第二种情况:f[i-1][j]表示不放入第i个物品,承重不变
代码如下:
#include<vector> #include<iostream> using namespace std; int main() { int n=0,m=0; cin>>n>>m; vector<int> w(n); vector<int> p(n); int f[10][10]={0}; cout<<"请输入重量and价值:"; for (int i=0;i<n;i++) { cin>>w[i]; cin>>p[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 if(f[i-1][j-w[i]]+p[i] > f[i-1][j]) { f[i][j]=f[i-1][j-w[i]]+p[i]; } else f[i][j]=f[i-1][j]; } } cout<<f[n][m]<<endl; return 0; }