• 背包(01,完全,多重,分组)


    01背包

    #include <cstdio>
    #include <iostream>
    using namespace std;
    int main()
    {
        int m,n,dp[100005];
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            int w,p;
            scanf("%d%d",&w,&p);
            for(int j=m;j>=w;j--)
            {
                dp[j]=max(dp[j-w]+p,dp[j]);
            }
        }
        printf("%d
    ",dp[m]);
        return 0;
    }

    完全背包

    #include <cstdio>
    #include <iostream>
    using namespace std;
    int f[1005],v[1005],w[1005];
    int main()
    {
        int n,m,ans;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          scanf("%d%d",&v[i],&w[i]);
        for(int i=1;i<=n;i++)
        {
            for(int j=v[i];j<=m;j++)
            {
                f[j]=max(f[j],f[j-v[i]]+w[i]);
            }
        }
        printf("%d
    ",f[m]);
        return 0;
    }

    多重背包(优化)

    #include <cstdio>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int f[2005];
    struct Good{
        int v,w;
    };
    vector <Good> goods;
    int main()
    {
        int n,m,ans,s,v,w;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&v,&w,&s);
            for(int k=1;k<=s;k*=2)
            {
                s-=k;
                goods.push_back({v*k,w*k});
            }
            if(s>0) goods.push_back({v*s,w*s});
        }
        for(auto good:goods)
        {
            for(int j=m;j>=good.v;j--)
            {
                f[j]=max(f[j],f[j-good.v]+good.w);
            }
        }
        printf("%d
    ",f[m]);
        return 0;
    }

    分组背包

    #include <cstdio>
    #include <iostream>
    const int M=1010;
    using namespace std;
    int main()
    {
        int m,n,w[M],p[M],arr[110][M],ar[M],num=0,dp[M];
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d%d%d",&w[i],&p[i],&a);
            num=max(num,a);
            ar[a]++;
            arr[a][ar[a]]=i;
        }
        for(int i=1;i<=num;i++)
        {
            for(int j=0;j<=m;j++)
            {
                for(int k=1;k<=ar[i];k++)
                {
                    int f=arr[i][k];
                    if(j+w[f]<=m)
                      dp[j]=max(dp[j],dp[j+w[f]]+p[f]);
                }
            }
        }
        printf("%d
    ",dp[0]);
        return 0;
    }

     混合背包

    #include <cstdio>
    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    const int M=1010;
    using namespace std;
    struct Good{
        int kind;
        int w,p;
    };
    
    vector <Good> goods;
    int main()
    {
        int m,n,dp[M];
        memset(dp,0,sizeof(dp));
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            int w,p,s;
            cin>>w>>p>>s;
            if(s<0)
            {
                goods.push_back({-1,w,p});
            }
            else if(s==0)
            {
                goods.push_back({0,w,p});
            }
            else
            {
                for(int k=1;k<=s;k*=2)
                {
                    s-=k;
                    goods.push_back({-1,w*k,p*k});
                }
                if(s>0)
                goods.push_back({-1,w*s,p*s});
            }
        }
        for(auto good:goods)
        {
            if(good.kind<0)
            {
                for(int j=m;j>=good.w;j--)
                    dp[j]=max(dp[j],dp[j-good.w]+good.p);
            }
            else
            {
                for(int j=good.w;j<=m;j++)
                    dp[j]=max(dp[j],dp[j-good.w]+good.p);
            }
        }
        cout<<dp[m]<<endl;
        return 0;
    }
  • 相关阅读:
    IMP本质上是一个通用的函数指针
    yourphp常用标签
    yourphp目录结构
    HTTP与HTTPS的区别
    https和http有什么区别
    如何把浏览器不信任的网址设置为可信任的网点
    ico图标在谷歌浏览器中如何显示?
    Yourphp是一款完全开源免费的.核心采用了Thinkphp框架
    No input file specified的解决方法apache伪静态
    一个服务器的吞吐率
  • 原文地址:https://www.cnblogs.com/zptcszj/p/11643836.html
Copyright © 2020-2023  润新知