zoukankan      html  css  js  c++  java
  • CODEVS 1959 拔河比赛(另一版本)

    题目描述 Description

    一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。

    输入描述 Input Description

    数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450)。

    输出描述 Output Description

    包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数不相等,则请把小的放在前面输出。

    样例输入 Sample Input

    3
    100
    90
    200

    样例输出 Sample Output

    190 200

     1 /**/
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 bool f[120][45600]={0};//[人数][体重差]
     9 int n,k,sum;
    10 int w[200];
    11 int main(){
    12     scanf("%d",&n);
    13     int i,j;
    14     for(i=1;i<=n;i++){
    15         scanf("%d",&w[i]);
    16         sum+=w[i];//总体重 
    17     }
    18     k=(n+1)/2;
    19     f[0][0]=1;
    20     for(i=1;i<=n;i++){//决策人数
    21         for(j=k;j>=1;j--){//选择人数 倒着循环(类比01背包)
    22             for(int a=sum;a>=0;a--){//累计体重
    23                 if(f[j-1][a])
    24                    f[j][a+w[i]]=1; 
    25             }
    26         }
    27     } 
    28 //    int ave=sum/2;
    29     int num;
    30     int min1=450000;
    31     for(i=0;i<=450*k;i++){
    32         if(f[k][i]){
    33             if(abs(sum-i-i)<min1){
    34                 min1=abs(sum-i-i);
    35                 num=min(i,sum-i);//更轻的队伍的体重 
    36             }
    37         }
    38     }
    39     printf("%d %d
    ",num,sum-num);
    40     return 0;
    41 }



  • 相关阅读:
    CentOS+Nginx+PHP+MySQL详细配置(图解)
    linux下MySQL安装登录及操作
    hdu 1059 多重背包
    hdu 1754 单点更新
    poj 3264 RMQ 水题
    hdu 1114 基础完全背包
    hdu 3466 排序01背包
    poj 2923 状压dp+01背包
    hdu 2639 第k大01背包
    hdu 2184 01背包变形
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5550586.html
Copyright © 2011-2022 走看看