首先安利一发背包九讲:https://www.cnblogs.com/jbelial/articles/2116074.html
简单说说今天学到的
一:01背包问题
(每个物体只能拿一次,要求在一定的空间内,拿物体使得到的价值最大)
有两种写法,一种是二维数组,一种是一维数组(省空间)
1.二维dp的模板:(很奇怪这种方式在有多个样例输入的情况下,不用清空dp数组)
状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-wei[i]]+val[i]);
基本操作:
if(j>=wei[i])
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-wei[i]]+val[i]);//i为面对第几个物体了
//j为所占的空间大小下,dp数组存的是对应的价值
}
else//这种写二维的方式可不清空
{
dp[i][j]=dp[i-1][j];
}
2.一维dp的模板(这种方式切记清空dp数组,还有就是注意要从后往前逆序推,因为这样得到的才是上一个状态的,否则会重复计算)
模板:
状态转移方程:dp[j]=max(dp[j],dp[j-wei[