一、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);
}
}