背包问题模板

来源:互联网 发布:淘宝的返利网 编辑:程序博客网 时间:2024/06/05 11:18

0/1背包模板

for(i=1;i<=n;i++)

for(j=v;j>=w[i];j--)//v为背包容量,w[i]为物品体积,a[i]为物品价值

dp[j]=max(dp[j],dp[j-w[i]]+a[i])



完全背包模板

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],
价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最
大。

for(i=1;i<=n;i++)

for(j=w[i];j<=v;j++)//v为背包容量,w[i]为物品体积,a[i]为物品价值

dp[j]=max(dp[j],dp[j-w[i]]+a[i])


多重背包模板

1.多重背包可以转化为0/1背包,比如说一个物品有两件吧,只需把它当做两个物品存入即可,不过这种方法易超时

2.第二种方法比较快捷只是有点复杂

void complete(int cost,int weight)  {  int i; for(i=cost;i<=v;i++)    dp[i]=max(dp[i],dp[i-cost]+weight);  }  void bag01(int cost,int weight)  {  int i; for(i=v;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+weight);   }void multiply(int cost,int weight,int amount)  {  int k; if(cost*amount>=v)    complete(cost,weight);   else{    k=1;    while(k<amount){     bag01(k*cost,k*weight);     amount-=k;     k+=k;    }    bag01(cost*amount,weight*amount);   } }



原创粉丝点击