01背包问题 泪的告白
2015-08-13 17:31
344 查看
01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?
这个问题有两种解法,动态规划和贪婪算法。
首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。
其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。
最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。
表达式中各个符号的具体含义。
w[i] : 第i个物体的重量;
p[i] : 第i个物体的价值;
c[i][m] : 前i个物体放入容量为m的背包的最大价值;
c[i-1][m] : 前i-1个物体放入容量为m的背包的最大价值;
c[i-1][m-w[i]] : 前i-1个物体放入容量为m-w[i]的背包的最大价值;
也可以理解为放入物体 i 后,剩余容量的最大价值;
由此可得:
c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(下图将给出更具体的解释)
第一行代表只有一个物品时,在容量为 j 时的最大价值;
第二行代表有二个物品时,在容量为 j 时的最大价值;
第二行代表有三个物品时,在容量为 j 时的最大价值;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= W; j++)
{
if(j < w[i]) dp[i][j] = dp[i-1][j];
else dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
}
}
这个问题有两种解法,动态规划和贪婪算法。
首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。
其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。
最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。
表达式中各个符号的具体含义。
w[i] : 第i个物体的重量;
p[i] : 第i个物体的价值;
c[i][m] : 前i个物体放入容量为m的背包的最大价值;
c[i-1][m] : 前i-1个物体放入容量为m的背包的最大价值;
c[i-1][m-w[i]] : 前i-1个物体放入容量为m-w[i]的背包的最大价值;
也可以理解为放入物体 i 后,剩余容量的最大价值;
由此可得:
c[i][m]=max{c[i-1][m-w[i]]+pi , c[i-1][m]}(下图将给出更具体的解释)
第一行代表只有一个物品时,在容量为 j 时的最大价值;
第二行代表有二个物品时,在容量为 j 时的最大价值;
第二行代表有三个物品时,在容量为 j 时的最大价值;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= W; j++)
{
if(j < w[i]) dp[i][j] = dp[i-1][j];
else dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
}
}
相关文章推荐
- 一个应届毕业生的求职回忆录(留给自己)
- 数据结构实验之栈四:括号匹配 SDUT 2134
- Crontab 每天定时备份 MySQL
- tableview 索引条问题
- 神经网络编程入门
- this
- MySql 定时任务 Event Scheduler
- MFC实现256色工具栏图标及工具栏提示信息
- CodeForces 5B - Center Alignment
- Spring---IOC简介
- 最优间隔分类、原始/对偶问题、SVM对偶—斯坦福ML公开课笔记7
- leetcode Minimum&&Max Depth of Binary Tree 求树的最小&&最大深度
- CoreImage 中的模糊滤镜
- [TroubleShooting] The remote copy of database xx has not been rolled forward to a point in time
- 《道德经》全文注释
- LeetCode OJ平台Sort Colors讨论主题算法
- 学习JAVA框架的心得体会
- kubernetes API Server 权限管理实践
- Android和服务器通信
- java输出获取英文字母