01背包问题 (好难理解)
来源:互联网 发布:怎么找淘宝客服工作 编辑:程序博客网 时间:2024/05/29 12:32
算法提高 01背包
时间限制:1.0s 内存限制:256.0MB
问题描述
给定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<=200,M<=5000.
//01背包问题#include<iostream>#include<string.h>using namespace std;int dp[220][5500];int max(int a,int b){if(a>b)return a;elsereturn b;}int main(){int n,m;//n:背包数目 m:最大容量cin>>n>>m;int i,j,w[220],v[220];//w[i]重量(可理解为第i个背包容量) ,v[i]价值for(i=1;i<=n;i++)//下标从1记录方便理解{cin>>w[i]>>v[i];}//动态规划dp[i][j] 记录 用j总容量去背起前i个背包中的若干个背包 的最大价值//将用j总容量背起前i个背包中若干个背包的问题变为:背第i个背包+用剩余容量j-w[i]去背起前i-1个背包中的若干个背包.//即dp[i][j]=v[i]+dp[i-1][j-w[i]];另外还有一种考虑不背第i个背包的即为:dp[i][j]=dp[i-1][j];//到此2种情况要判断取最大,故得出状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);//可见求前i个背包用j容量的最大价值需要先知道dp[i-1][j]和dp[i-1][j-w[i]]这2个值已经在计算i的前算出.memset(dp,0,sizeof(dp));for(i=1;i<=n;i++){for(j=1;j<=m;j++){dp[i][j]=max(dp[i][j],dp[i-1][j]);if(j-w[i]>=0)dp[i][j]=max(dp[i][j],dp[i-1][j-w[i]]+v[i]);}}cout<<dp[n][m]<<endl;return 0;}
阅读全文
0 0
- 01背包问题 (好难理解)
- 01背包问题的理解
- 背包01问题初理解
- ZOJ3164【背包问题(好题)】
- 杭电2602(01背包问题)——第一次做背包问题的理解
- 01背包问题(最易理解的讲解)
- 从01背包问题理解动态规划
- 从01背包问题理解动态规划
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包 + 完全背包 + 多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 背包问题模板(01背包,完全背包,多重背包)
- 经典背包问题----(01背包、完全背包、多重背包)
- 理解背包问题
- 理解背包问题
- mysqli事务实例
- Java基础加强总结(一)——注解(Annotation)
- 元素的隐藏和显示(v-show指令)
- Linux 系统结构
- 一个Linux内核利用init_task进行进程管理的简单例子
- 01背包问题 (好难理解)
- fedora18系统中安装Apache+PHP+MySQL环境
- POJ
- ssh服务安装和登录出现的几种错误以及解决办法
- 得出四位数中的吸血鬼数字
- 当前砾石充填完井方式存在的问题有哪些?
- 修改mac系统下/etc/profile文件
- 数据库事物基础知识
- 关注民生民情