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]);
             }
        } 
    }
  • 相关阅读:
    注册审核
    静态表单验证
    多条件查询
    0623TP框架联系
    0618框架 增删改练习
    php框架 数据添加
    0616框架查询
    0614空操作方法 空控制器 跨控制器调用 命名空间
    php 0613框架基础
    php查询
  • 原文地址:https://www.cnblogs.com/aprincess/p/11858807.html
Copyright © 2011-2022 走看看