zoukankan      html  css  js  c++  java
  • hdu 1171 Big Event in HDU(dp 01背包 母函数)

    题意:有n种物品 每种价值 vi 有 ci件

             问分成两堆 最平均的价值分配是多少

    思路:

    01背包

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int v[100],m[100];
    int dp[300000];
    int main()
    {
        int n;
        int i,j,k;
        while(scanf("%d",&n)!=EOF)
        {
            if(n<0) break;
            int sum=0;
            for(i=0;i<n;i++)
            {
                scanf("%d%d",&v[i],&m[i]);
                sum+=v[i]*m[i];
            }
            memset(dp,0,sizeof(dp));
            dp[0]=1;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m[i];j++)
                {
                    for(k=sum;k>=v[i];k--)
                    {
                        if(dp[k-v[i]]==1)
                            dp[k]=1;
                    }
                }
            }
            int half=sum/2;
            while(dp[half]==0) half--;
            printf("%d %d
    ",sum-half,half);
        }
        return 0;
    }
    

    母函数

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int c1[300000],c2[300000];
    int v[100],m[100];
    int n;
    void fun(int sum)
    {
        int i,j,k;
        int tsum=0;
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        c1[0]=1;
       for(i=0;i<n;i++)
       {
           int add=v[i];
           //tsum+=v[i]*m[i];
           for(j=0;j<=sum;j++)
           {
               for(k=0;k<=m[i]*v[i];k+=add)
               {
                   c2[j+k]+=c1[j];
               }
           }
           for(j=0;j<=sum;j++)
           {
               c1[j]=c2[j];
               c2[j]=0;
           }
       }
    }
    int main()
    {
        int i,j,k;
        while(scanf("%d",&n)!=EOF)
        {
            if(n<0) break;
            int sum=0;
            for(i=0;i<n;i++)
            {
                scanf("%d%d",&v[i],&m[i]);
                sum+=v[i]*m[i];
            }
            fun(sum);
            int half=sum/2;
            while(c1[half]==0) half--;
            printf("%d %d
    ",sum-half,half);
        }
        return 0;
    }
    
  • 相关阅读:
    修改 dll
    SQLServer中char、varchar、nchar、nvarchar的区别:
    关于破解的一点心得
    asp.net 操作XML
    jquery autocomplete
    【转】height,posHeight和pixelHeight区别
    异常处理 Access to the path is denied
    asp.net 获得客户端 mac 地址
    cmd 跟踪路由
    Excel 宏
  • 原文地址:https://www.cnblogs.com/sola1994/p/4681133.html
Copyright © 2011-2022 走看看