• zoj 1880


    题目:有n个人分成两组,两组人数差不能超过1,找到两组的人重量之差的最小值。

    分析:dp,二维01背包。

                由于必须放在两个组中的一组,直接背包全部可到状态,

                取出相差不超过 1的最接近 sum/2的值就可以。

    说明:430ms。

    。好慢啊。。

    2011-9-30 18:37)。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int f[ 52 ][ 22501 ];
    int h[ 101 ];
    
    int main()
    {
        int n,sum;
        while ( scanf("%d",&n) != EOF && n != -1 ) {
            sum = 0;
            for ( int i = 1 ; i <= n ; ++ i ) {
                scanf("%d",&h[ i ]);
                sum += h[ i ];
            }
            
            memset( f, 0, sizeof( f ) );
            f[ 0 ][ 0 ] = 1;
            for ( int i = 1 ; i <= n ; ++ i ) 
            for ( int l = n/2+1 ; l > 0 ; -- l )
            for ( int j = sum/2 ; j >= h[ i ] ; -- j )
                if ( f[ l-1 ][ j-h[ i ] ] ) 
                    f[ l ][ j ] = 1;
            
            int move = sum/2;
            while ( move ) {
                if ( n%2 == 0 && f[ n/2+0 ][ move ] ) break;
                if ( n%2 == 1 && f[ n/2+1 ][ move ] ) break;
                if ( n%2 == 1 && f[ n/2-0 ][ move ] ) break;
                -- move;
            }
            
            printf("%d %d
    ",move,sum-move);
        }
        return 0;
    }


  • 相关阅读:
    Access小用之感
    PHP学习之路今日开启
    IBatis初体验2
    PHP之PDO介绍
    javascript key code 大全
    如何将虚拟机中的Linux系统与shell终端连接
    linux磁盘情况查询
    vi和vim编辑器的使用
    Linux磁盘分区,挂载
    (转)Android Dalvik虚拟机初识
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6902910.html
Copyright © 2020-2023  润新知