算法提高 01背包
来源:互联网 发布:百度快速排名软件 编辑:程序博客网 时间:2024/06/05 05:00
问题描述
给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
输入格式
输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
以后N行每行两个数Wi和Vi,表示物品的重量和价值
以后N行每行两个数Wi和Vi,表示物品的重量和价值
输出格式
输出1行,包含一个整数,表示最大价值。
样例输入
3 5
2 3
3 5
4 7
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
- 算法提高 01背包
- 算法提高 01背包
- 算法提高 01背包
- 算法提高 01背包
- 算法提高 01背包
- 算法提高 01背包
- 蓝桥杯 算法提高 01背包
- 蓝桥杯 算法提高 01背包
- 蓝桥杯--算法提高 01背包
- 蓝桥杯 算法提高 01背包
- 蓝桥杯 算法提高 01背包
- 蓝桥杯 算法提高 01背包
- 蓝桥杯 ADV-144算法提高 01背包
- 算法提高 01背包 hdu2602 Bone Collector
- 算法提高 01背包 蓝桥杯训练
- 算法提高 ADV-144 01背包
- 2016蓝桥杯算法提高——01背包
- 蓝桥杯_算法提高_01背包(动态规划算法)
- Spring MVC 入门示例讲解
- Web API性能优化(一)压缩
- LinkedList分析
- scroller机制
- 基于香农熵的决策树算法
- 算法提高 01背包
- 我的 MarkDown 学习笔记
- Ireport 序号自增
- 磁盘命令
- SparkStreaming消费Kafka数据遇到的问题
- Android 自定义View第三弹——继承控件
- 使用Eclipse进行远程调试
- Cetos 7.2+LNMP+WordPress
- 文件grep