您的位置:首页 > 其它

01背包+完全背包+多重背包模板

2017-03-07 20:57 387 查看
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);  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: