背包模板(01背包,完全背包,多重背包)

背包模板(01背包,完全背包,多重背包)
一、01背包:
#define N ..///N这个值是根据具体的题目来定的
int v;   ///v为总的容量
int dp[N];

void ZeroOnePack(int cost,int weight)
{
    for(int j=v;j>=cost;j--)   ///注意是逆序的
        dp[j]=max(dp[j],dp[j-cost]+weight);
}
 

二、完全背包:

#define N ..///N这个值是根据具体的题目来定的
int v;   ///v为总的容量
int dp[N];

void CompletePack(int cost,int weight)
{
    for(int j=cost;j<=v;j++)   ///注意是顺序的
        dp[j]=max(dp[j],dp[j-cost]+weight);
}
 
三、多重背包:


#define N ..///N这个值是根据具体的题目来定的
int v;   ///v为总的容量
int dp[N];

void MultiplePack(int cost,int weight,int amount){
    if(cost*amount>=v)
        CompletePack(cost,weight);
    else
    {
        int k=1;
        while(k<amount)
        {
            ZeroOnePack(k*cost,k*weight);
            all-=k;
            k+=k;
        }
        ZeroOnePack(amount*cost,amount*weight);
    }
}
原文地址:https://www.cnblogs.com/qq2424260747/p/4485164.html