背包总结
int dp[M]; // dp[i][k] : 第i分组中 消耗为k时 的最优价值
int n[50+10]; // 每种的个数
int v[50+10]; // 每种的价值
void ZeroOnePack(int cost,int value ,int max_cost){
for (int i = max_cost; i >= cost ; i--){
if (dp[i] < dp[i-cost] + value){
dp[i] = dp[i-cost] + value;
}
}
}
void CompletePack(int cost, int value,int max_cost){
for (int i = cost ; i <= max_cost ; i++){
if(dp[i] < dp[i-cost] + value){
dp[i] = dp[i-cost] + value;
}
}
}
void MultiplePack(int cost,int value,int amount,int max_cost){
if (cost*amount >= max_cost){
CompletePack(cost,value,max_cost);
}else{
for (int k = 1 ; k <= amount ; k <<= 1){
if (k*cost < max_cost){
ZeroOnePack(cost*k , value*k , max_cost);
amount -= k;
}
}
ZeroOnePack(cost*amount , value*amount , max_cost);
}
}
int dp[M]; // dp[i][k] : 第i分组中 消耗为k时 的最优价值
int n[50+10]; // 每种的个数
int v[50+10]; // 每种的价值
void ZeroOnePack(int cost,int value ,int max_cost){
for (int i = max_cost; i >= cost ; i--){
if (dp[i] < dp[i-cost] + value){
dp[i] = dp[i-cost] + value;
}
}
}
void CompletePack(int cost, int value,int max_cost){
for (int i = cost ; i <= max_cost ; i++){
if(dp[i] < dp[i-cost] + value){
dp[i] = dp[i-cost] + value;
}
}
}
void MultiplePack(int cost,int value,int amount,int max_cost){
if (cost*amount >= max_cost){
CompletePack(cost,value,max_cost);
}else{
for (int k = 1 ; k <= amount ; k <<= 1){
if (k*cost < max_cost){
ZeroOnePack(cost*k , value*k , max_cost);
amount -= k;
}
}
ZeroOnePack(cost*amount , value*amount , max_cost);
}
}