2019寒假集训DAY1背包问题

Posted songjian-jiansong

tags:

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

基本信息

  • 金矿模型理解:http://www.cnblogs.com/sdjl/articles/1274312.html
  • 适用条件: 重叠子结构、最优子问题、边界、子问题独立+转移方程式
  • 背包九讲(结合题目):http://www.cnblogs.com/jbelial/articles/2116074.html
  • 框架

    01背包问题:

    无优化

    for(int i=1;i<=n;i++)
    {
        for(int c=0;c<=m;c++)
        {
            f[i][c]=f[i-1][c];
            if(c>=w[i])
            f[i][c]=max(f[i][c],f[i-1][c-w[i]]+v[i]);
        }
    }

    一维数组优化:

    for(int i=1;i<=n;i++)
    {
        for(int c=m;c>=0;c--)
        {
            if(c>=w[i])
            f[c]=max(f[c],f[c-w[i]]+v[i]);
        }
    }

    更进一步的常数优化:

    for(int i=1;i<=n;i++)
    {
        sumw+=w[i];
        bound=max(m-sumw,w[i]);
        for(int c=m;c>=bound;c--)
        {
            if(c>=w[i])
            f[c]=max(f[c],f[c-w[i]]+v[i]);
        }
    }

    完全背包问题:

    for(int i=1;i<=n;i++)
    {
        for(int c=0;c<=m;c++)
        {
            if(c>=w[i])
            f[c]=max(f[c],f[c-w[i]]+v[i]);
        }
    }

    多重背包问题:

    for(int i=1;i<=n;i++)
    {
        if(w[i]*a[i]>m)
        {
            for(int c=0;c<=m;c++)
            {
            if(c>=w[i])
            f[c]=max(f[c],f[c-w[i]]+v[i]);
            }
        }
        else
        {
             k=1;amount=a[i];
             while(k<amount)
             {
                 for(int c=k*w[i];c>=0;c--)
                 {
                     if(c>=w[i])
                     f[c]=max(f[c],f[c-w[i]]+k*v[i]);
                 }
                 amount-=k;
                 k<<=1;
             }  
             for(int c=amount*w[i];c>=0;c--)
             {
                 f[c]=max(f[c],f[c-w[i]]+amount*v[i]);
             }
        } 
    }

01背包

 

以上是关于2019寒假集训DAY1背包问题的主要内容,如果未能解决你的问题,请参考以下文章

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2019寒假集训DAY2图论

2022牛客寒假算法基础集训营 4 全部题解

2022牛客寒假算法基础集训营 4 全部题解

2019暑假集训DAY1(problem3.play)(单调栈思想)