zoukankan      html  css  js  c++  java
  • hdu 1059 多重背包 背包指数分块

    思路:

    这个方法要看《浅谈几类背包问题》这篇论文。

    #include"stdio.h"
    #define Max(a,b) (a)>(b)?(a):(b)
    int f[31],k[8];
    int main()
    {
        int i,j,m,Case=0;
        while(scanf("%d%d%d%d%d%d",&k[1],&k[2],&k[3],&k[4],&k[5],&k[6])!=EOF,k[1]|k[2]|k[3]|k[4]|k[5]|k[6])
        {
            for(i=0;i<=30;i++)
                f[i]=0;
            int sum=k[1]+k[2]*2+k[3]*3+k[4]*4+k[5]*5+k[6]*6;
            sum%=60;
            int c=sum/2;
            if(sum%2!=0)
            {
                printf("Collection #%d:
    Can't be divided.
    
    ",++Case);
                continue;
            }
            for(i=1;i<=6;i++)
            {
                m=1;
                if(k[i]==0) continue;
                while(k[i]>0)
                {
                    if(k[i]<m)
                        m=k[i];
                    k[i]-=m;
                    for(j=c;j>=m*i;j--)
                    {
                        f[j]=Max(f[j],f[j-m*i]+i*m);
                    }
                    m*=2;
                }
            }
            if(f[c]==c)
                printf("Collection #%d:
    Can be divided.
    
    ", ++Case);
            else
                printf("Collection #%d:
    Can't be divided.
    
    ",++Case);
        }
        return 0;
    }
  • 相关阅读:
    python03-if
    python03
    基础知识梳理
    开篇话
    托管代码---> CLR --> 自宿主
    反射定义及基础案例
    c# 中委托的发展
    委托代码案例
    委托(实例)
    字节(Byte) 与 位(bit)
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3233467.html
Copyright © 2011-2022 走看看