混合背包(背包03)

Posted 一蓑烟雨任生平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了混合背包(背包03)相关的知识,希望对你有一定的参考价值。

将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题

根据三种背包的思想,那么可以得到
混合三种背包的问题可以这样子求解
  for(int i=1; i<=N; ++i)
    if(第i件物品是01背包)
      zeroOnePack(c[i],w[i]);
    else if(第i件物品是完全背包)
      completePack(c[i],w[i]);
    else if(第i件物品是多重完全背包)
      multiplePack(c[i],w[i],n[i]);
这样能得到最优解的原因是,因为前一层已经是得到最优解了,
当前层求解最优解的时候,我们考虑要使用三种背包中的哪一种方法
而不用考虑前一层是怎么得到最优解的

#include <stdio.h>
#include <string.h>
int cash;
int n[11],dk[11];
int dp[1000000];
inline int max(const int &a, const int &b)
{
    return a < b ? b : a;
}
void CompletePack(int cost)
{
    for(int i=cost; i<=cash; ++i)
        dp[i] = max(dp[i],dp[i-cost]+cost);
}
void ZeroOnePack(int cost)
{
    for(int i=cash; i>=cost; --i)
        dp[i] = max(dp[i],dp[i-cost]+cost);
}
void MultiplePack(int cnt, int cost)
{
    if(cnt*cost >=cash)//如果第i种物品的费用总和超过背包容量,那么就是完全背包问题
        CompletePack(cost);
    else
    {
        int k = 1;//二进制拆分
        while(k<cnt)//判断剩下的数字能不能够拆分为k
        {
            ZeroOnePack(cost*k);
            cnt -=k;
            k<<=1;
        }
        ZeroOnePack(cnt*cost);
    }
}
int main()
{
    //输入的处理以及函数的调用
    return 0;
}

 如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88

以上是关于混合背包(背包03)的主要内容,如果未能解决你的问题,请参考以下文章

蒟蒻吃药计划-治疗系列 #round4 多重背包+混合背包代码存放

AC_7混合背包问题

codevs 3269 混合背包(复习混合背包)

动态规划/背包问题背包问题第一阶段最终章:混合背包问题

动态规划/背包问题背包问题第一阶段最终章:混合背包问题

01背包,完全背包,多重背包,混合背包