0/1背包
给定n
个物品,其中第i
个物品的体积为vi
,价值为wi
。将若干个物品放入容量为m
的背包,在使物体总体积不超过m
的前提下,物品的总价值和最大,求出此时的最大价值。
int f[MAX_M+1];
memset(f,0,sizeof(f));
f[0]=0;
for(int i=1; i<=n; i++)
for(int j=m; j>=v[i]; j--)
f[j]=max(f[j],f[j-v[i]]+w[i]);
int ans=0;
for(int j=0; j<=m; j++)
ans=max(ans,f[j]);
完全背包
给定n
种物品,其中第i种物品的提及为vi
,价值为wi
,并且有无数个。将若干个物品放入容量为m
的背包,在使物体总体积不超过m
的前提下,物品的总价值和最大,求出此时的最大价值。
int f[MAX_M+1];
memset(f,0,sizeof(f));
f[0]=0;
for(int i=1; i<=n; i++)
for(int j=v[i]; j<=m; j++)
f[j]=max(f[j],f[j-v[i]]+w[i]);
int ans=0;
for(int j=0; j<=m; j++)
ans=max(ans,f[j]);
多重背包
给定n
种物品,其中第i种物品的提及为vi
,价值为wi
,并且有ci
个。将若干个物品放入容量为m
的背包,在使物体总体积不超过m
的前提下,物品的总价值和最大,求出此时的最大价值。
直接拆分法:
unsigned int f[MAX_M+1];
memset(f,0,sizeof(f));
f[0]=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=c[i]; j++)
for(int k=m; k>=v[i]; k--)
f[k]=max(f[k],f[k-v[i]]+w[i]);
int ans=0;
for(int j=0; j<=m; j++)
ans=max(ans,f[j]);
分组背包
给定n
组物品,其中第i
组有ci
个物品。第i
组第j
个物品的体积为vij
,价值为wij
。将若干个物品放入容量为m
的背包,在使物体总体积不超过m
的前提下,物品的总价值和最大,求出此时的最大价值。
int f[MAX_M+1];
memset(f,0,sizeof(f));
f[0]=0;
for(int i=1; i<=n; i++)
for(int j=m; j>=0; j--)
for(int k=1; k<=c[i]; k++)
if(j>=v[i][k])
f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);