zoukankan      html  css  js  c++  java
  • 背包问题汇总

    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]);
             }
        } 
    }
    
    七月在野,八月在宇,九月在户,十月蟋蟀入我床下
  • 相关阅读:
    成为一个会思考的学习者
    我的第4篇博客
    我的第3篇博客
    第2次作业
    第一次作业:大学,人生的另一个新的开始
    第四次作业
    第三次作业
    第二次作业
    作为大一新生的感悟
    第四次作业
  • 原文地址:https://www.cnblogs.com/voids5/p/12695042.html
Copyright © 2011-2022 走看看