n种物品,容量为v,第i件费用为c[i],价值为w[i]
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);
- }