一.不考虑时间复杂度和空间复杂度,只考虑正确性的传统模板:
(1) 0-1背包:n表示物品个数,c[i]表示第i个物品的价值,v[i]表示第i个物品的容积,给定背包总容积V
for(int i=1;i<=n;i++)
{
for(int j=0;j<=V;j++)
{
f[i][j]=f[i-1][j];
if(j-v[i]>=0)
f[i][j]=max(f[i][j],f[i-1][j-v[i]]+c[i]);
}
}
int ans=0;
for(int i=0;i<=V;i++)
ans=max(ans,f[n]i]);
pritnf("%d\n",ans); //即价值最大为ans
(2)完全背包:有n种物品,每种物品个数没有限制,无限件,给定总容积为V;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=V;j++)
{
f[i][j]=f[i-1][j];
for(int k=0;k<=V/v[i];k++)
{
if(j-k*v[i]>=0)
{
f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*c[i]);
}
}
}
}
int ans=0;
for(int i=0;i<=V;i++)
ans=max(ans,f[n][i]);
printf("%d\n",ans);
二. 优化后的考虑时间和空间复杂度的成熟模板:
(1) 0-1背包优化模板:
for(int i=1;i<=n;i++)
{
for(int j=V;j>=0;j–)
{
if(j-v[i]>=0)
f[j]=max(f[j],f[j-v[i]]+c[i]);
}
}
printf("%d\n",f[n]) //即为最大价值
(2)完全背包优化代码模板:
for(int i=1;i<=n;i++)
{
for(int j=0;j<=V;j++)
{
if(j-v[i]>=0)
f[j]=max(f[j],f[j-v[i]]+c[i]);
}
}
printf("%d\n",f[n]); //即为价值最大值