By Jeffery
名思顾意,只有两种选择:0(不拿)或1(拿)。
也可以从名字里看出来,有+1种选择,分别是取0,1,2,3 件物品
可以取无限件,有无限种选择。
都有物品重量
、背包容量
,物品价值
。
1.阶段dp[前1~i个物品][容量为1~j];
2.状态(受哪些对象约束)物品重量,背包容量,物品价值
3.决策放或不放
4.状态转移方程dp[i][j]=max(dp[i-1][j]/*不放*/,dp[i-1][j-w[i]]+c[i]/*放*/)
5.初始值i=1,j=m
6.目标值dp[n][1]
for(int i=1;i<=n;++i)//阶段:物品
{
for(j=m;j>=1;j--)//状态:dp[i][j]
{
dp[i][j]=max(dp[i-1][j]/*不放*/,dp[i-1][j-w[i]]+c[i]/*放*/);//状态转移方程
}
}
省略了第一维
1.阶段[容量为1~j];
2.状态(受哪些对象约束)物品重量,背包容量,物品价值
3.决策放或不放
4.状态转移方程dp[j]=max(dp[j]/*不放*/,dp[j-w[i]]+c[i]/*放*/)
5.初始值j=m
6.目标值dp[1]
//dp[容量为j];
for(int i=1;i<=n;++i)//阶段:物品
{
for(j=m;j>=1;j--)//状态:dp[j]
{
dp[j]=max(dp[j]/*不放*/,dp[j-w[i]]+c[i]/*放*/);//状态转移方程
}
}
1.阶段dp[前1~i个物品][容量为1~j];
2.状态(受哪些对象约束)背包容量,物品重量,物品价值,物品数量
3.决策放1~p[i]个或不放
4.状态转移方程dp[i][j]=max(dp[i][j]/*不放*/,dp[i-1][j-k*w[i]]+k*c[i]/*放*/)
5.初始值i=1,j=1,k=0
6.目标值dp[n][v]
//p[i]:第i种物品的数量
//w[i]:第i种物品的重量
for(int i=1;i<=n;++i)//阶段:物品
{
for(j=1;j<=v;j--)
{
for(int k=0;k<=p[i]&&k*w[j]<=j;k++)
{
dp[i][j]=max(dp[i][j]/*不放*/,dp[i-1][j-k*w[i]]+k*c[i]/*放*/);//状态转移方程
}
}
}
虽然完全背包能取无限件,但最多只能把背包塞满,所以完全背包可以像多重背包来解
1.阶段dp[前1~i个物品][容量为1~j];
2.状态(受哪些对象约束)物品重量,背包容量,物品价值
3.决策放1~w[i]件或不放
4.状态转移方程dp[i][j]=max(dp[j]/*不放*/,dp[j-w[i]]+c[i]/*放*/)
5.初始值i=1,j=w[i]
6.目标值dp[n][m]
for(int i=1;i<=n;++i)//阶段:物品
{
for(j=w[i];j<=m;++j)//状态:dp[i][j]
{
dp[i][j]=max(dp[j]/*不放*/,dp[j-w[i]]+c[i]/*放*/);//状态转移方程
}
}