01背包+完全背包+多重背包模板
2017-03-07 20:57
387 查看
n种物品,容量为v,第i件费用为c[i],价值为w[i]
1.01背包
方程:
模板:
void zeropack(int cost,int weight)
{
for(int i=v;i>=cost;i--)
dp[i]=max(dp[i-cost]+weight,dp[i]);
}
for(int i=1;i<=n;i++)
zeropack(c[i],w[i]);
2.完全背包
void completepack(int cost,int weight)
{
for(int i=cost;i<=V;i++)
dp[i]=max(dp[i-cost]+weight,dp[i]);
}
3.多重背包
void multipack(int cost,int weight,int num)
{
if(num*cost>=V)
{
completepack(cost,weight);
return;
}
int k=1;
while(k<num)
{
zeropack(k*cost,k*weight);
num-=k;
k*=2;
}
zeropack(cost*num,weight*num);
}
1.01背包
方程:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
模板:
void zeropack(int cost,int weight)
{
for(int i=v;i>=cost;i--)
dp[i]=max(dp[i-cost]+weight,dp[i]);
}
for(int i=1;i<=n;i++)
zeropack(c[i],w[i]);
2.完全背包
f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}
void completepack(int cost,int weight)
{
for(int i=cost;i<=V;i++)
dp[i]=max(dp[i-cost]+weight,dp[i]);
}
3.多重背包
f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}
num 为限制几个
void multipack(int cost,int weight,int num)
{
if(num*cost>=V)
{
completepack(cost,weight);
return;
}
int k=1;
while(k<num)
{
zeropack(k*cost,k*weight);
num-=k;
k*=2;
}
zeropack(cost*num,weight*num);
}
相关文章推荐
- [DP][01背包]01\完全\多重背包模板
- 在线模板_01背包_完全背包_多重背包
- hdu 2844 多重背包模板题 01背包、完全背包、多重背包模板
- dp 01背包,完全背包,多重背包 模板
- 01背包,完全背包,多重背包 ,模板代码
- HDU ACM 2844 Coins (多重背包)----------------01背包,完全背包,多重背包模板
- 01背包 完全背包 多重背包模板
- 01背包模板、完全背包 and 多重背包(模板)
- 模板-01背包-完全背包-多重背包
- 动规-01背包\完全背包\多重背包\混合多重背包模板
- 01背包、完全背包、多重背包详解
- 01背包模板、完全背包 and 多重背包(模板)
- HDU - 4508-湫湫系列故事——减肥记I(完全背包模板题)
- 背包九讲系列1——01背包、完全背包、多重背包
- hihocoder(1038,1043) 01背包与完全背包
- 完全背包模板 hdoj 1114
- 经典背包问题 01背包+完全背包+多重背包
- 背包模板(01背包,完全背包,多重背包)
- hrbust 哈理工 2252 完全背包模板题
- 01背包、完全背包、多重背包模版。