题目
基本算法
for(int i=1;i<=N;i++)
{
for(int v=0;v<=V;v++)
{
for(int k=0;k<=Mi;k++)
{
F[i][v]=max(F[i][v],F[i-1][v-k*C[i]]+k*W[i]);
}
}
}
转化为01背包问题
1.
2.
//二进制优化
num=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&wi,&vi,&ci); //wi代表花费,vi代表价值,ci代表数量
for(int j=1;j<=ci;j*=2)
{
value[num]=j*vi;
weight[num++]=j*wi;
ci-=j;
}
if(ci>0) //若优化而还有剩余,则直接将ci倍的vi和ci倍的wi分别存入value和weight
{
value[num]=ci*vi;
weight[num++]=ci*wi;
}
}
for(int i=1;i<num;i++)
{
for(int j=V;j>=weight[i];j--)
{
if(dp[j]<dp[j-weight[i]]+value[i])
dp[j]=dp[j-weight[i]]+value[i];
}
}
printf("%d\n",dp[V]);
可行性问题O(VN)的算法
摘自《背包九讲》