#动态规划思想
前言
我在刚刚学01背包的时候看了很多的视频和文章,当时并无法理解,但过了一段时间之后突然 “顿悟” ,发现是自己对dp数组的定义不够清晰。大家应该都看过题目了,我就不再赘述了。
一、怎么解?
dp(Dynamic Programming)数组是对背包装物品的内部模拟,这个数组的元素dp[i][j]是什么意思呢,代表在前i(包括i)个物品中,当前背包容量j的最优解,这个当前背包容量什么意思呢,就是我们的数组dp是记录背包容量为1到m的最优解,大家画个图就明白了,我就用运行结果给大家看了。每个dp[i][j]有两种情况,放或者不放,如果放的话就要考虑剩下的背包容量怎么办,不放的话直接继承上一次当前背包容量最优解。如果放的话dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);什么意思呢?就是说dp[i-1][j]是不放当前物品时的最优解,dp[i-1][j-w[i]],表示的是在选择当前物品后剩下的背包容量中的最优解,然后判断是当前物品价值v[i]+剩下的背包容量的价值最大值和不选择当前物品时的价值比较,选择最大值。
二、使用步骤
1.具体代码
代码如下(示例):核心代码
for(i=0;i<n;i++)
for(j=1;j<=m;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]);
}
}
2.读入数据
代码如下(示例):
请输入背包的容量 和 物品的数量:6 3
请输入物品的重量和价值:
1 2
3 4
5 7
最大为9
dp的内部空间为:
2 2 2 2 2 2
2 2 4 6 6 6
2 2 4 6 7 9