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 }



  • 相关阅读:
    20159302 《网络攻击与防范》第三周学习总结
    Json序列化空时间字段出异常
    IIS 原理
    谴责盛大Bambook 的ADB.EXE流氓进程
    Fix: ADB server didn’t ACK
    在线UI设计
    解决装Windows蓝屏问题。
    如何成为一个C++高级程序员
    Python编程规范及性能优化
    iDempiere 使用指南 插件安装过程
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5550586.html
Copyright © 2011-2022 走看看