• 0x52 背包


    还行

    前面的题没啥意思

    完全背包一个很难写的题poj1015 Jury Compromise

    poj1742 多重背包啊,开始写了二进制拆分TLE了,由于是判是否可以组成,那么可以用一个贪心的思想,顺着for一个个叠加

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    int a[110],c[110],q[2100];
    bool f[110000];
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0||m==0)break;
            for(int i=1;i<=n;i++)scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)scanf("%d",&c[i]);
            
            int len=0;
            for(int i=1;i<=n;i++)
            {
                int k=(1<<10);
                while(k-1>c[i])k>>=1;
                k>>=1;
                while(k>0)
                {
                    q[++len]=a[i]*k;
                    c[i]-=k;k>>=1;
                }
                if(c[i]!=0)q[++len]=a[i]*c[i];
            }
            n=len; 
            
            //------------二进制拆分-----------------
            
            memset(f,false,sizeof(f));f[0]=true;
            for(int i=1;i<=n;i++)
                for(int j=m;j>=q[i];j--)
                    if(f[j-q[i]]==true)f[j]=true;
            
            int ans=0;
            for(int i=1;i<=m;i++)
                if(f[i]==true)ans++;
            printf("%d
    ",ans);
        }
        return 0;
    }
    poj1742(TLE)
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    int a[110],c[110];
    bool f[110000]; int u[110000];
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0||m==0)break;
            for(int i=1;i<=n;i++)scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)scanf("%d",&c[i]);
            
            memset(f,false,sizeof(f));f[0]=true;
            for(int i=1;i<=n;i++)
            {
                memset(u,0,sizeof(u));
                for(int j=a[i];j<=m;j++)
                    if(f[j]==false&&f[j-a[i]]==true&&u[j-a[i]]<c[i])
                    {
                        f[j]=true;
                        u[j]=u[j-a[i]]+1;
                    }
            }
            
            int ans=0;
            for(int i=1;i<=m;i++)
                if(f[i]==true)ans++;
            printf("%d
    ",ans);
        }
        return 0;
    }
    poj1742

    分组背包没例题啊,而且好像也没什么

  • 相关阅读:
    ubuntu 12.04 配置iscsi共享及挂载iscsi共享
    python_数据类型
    python_基本操作
    shell习题第5题:批量更改文件后缀名
    shell习题第4题:监控ip地址存活
    shell习题第3题:统计内存大小
    shell习题第2题:统计ip访问量
    shell习题第1题:每日一文件
    IIS网站的应用程序与虚拟目录的区别及应用
    http状态码
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9455929.html
Copyright © 2020-2023  润新知