算法提高 01背包

来源:互联网 发布:百度快速排名软件 编辑:程序博客网 时间:2024/06/05 05:00

问题描述
  给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
输入格式
  输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
  以后N行每行两个数Wi和Vi,表示物品的重量和价值
输出格式
  输出1行,包含一个整数,表示最大价值。
样例输入
3 5
2 3
3 5
4 7
样例输出
8
数据规模和约定
  1<=N<=2
00,M<=5000.


对01背包动态规划很好的解析http://blog.csdn.net/kangroger/article/details/38864689

我说一下测试用例的结果8是怎么得来的,如图


如果能把图填出来,那么代码就很好理解了

#include<iostream>#include<algorithm>#include<cstdio>using namespace std;int f[5001][5001];  //保存每种容量下的最大价值 int main(){int w[5001],v[5001],i,j,n,m,x,y;cin>>n>>m;for (i=1;i<=n;i++) cin>>w[i]>>v[i];for(i=1;i<=n;i++){for (j=1;j<=m;j++){if (j>=w[i])//容量为j时可以可以容纳w[i] ,最大价值有两种可能  { x=f[i-1][j];//上一个的价值  y=f[i-1][j-w[i]]+v[i];//j-w[i]:多出的容积,整句意思是多出的容量的最大价值+当前的价值     f[i][j]=max(x,y);//取两个的最大值  }else//不能容纳  f[i][j]=f[i-1][j];}}cout<<"最大值"<<f[n][m]<<endl;for (i=1;i<=n;i++){for (j=1;j<=m;j++) cout<<f[i][j]<<" "; cout<<endl;}return 0;}


蓝桥提交代码:

#include<iostream>#include<algorithm>using namespace std;int main(){int n,m,w[5001]={0},v[5001]={0},f[5001]={0},i,j;cin>>n>>m;for (i=1;i<=n;i++){cin>>w[i]>>v[i];}for (i=1;i<=n;i++)for (j=m;j>=w[i];j--){f[j]=max(f[j-w[i]]+v[i],f[j]);//将上个代码优化,f数组到最后是表示容量在1~m中对应的最大价值}cout<<f[m]<<endl;//满足最大容量的价值return 0;}


0 0