zoukankan      html  css  js  c++  java
  • codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品

    1959 拔河比赛

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 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

    数据范围及提示 Data Size & Hint
     

    分类标签 Tags 点此展开 

     
    /*bool数组判断由前i个物品能否到达j这个质量*/
    #include<iostream>
    using namespace std;
    #include<cstdio>
    bool f[101][45001]={false};
    int n,w[101];
    int main()
    {
        int k,sum=0,summ;
        scanf("%d",&n);
        if(n%2==1) k=(n+1)/2;/*k,summ,这样做的目的是在n是奇数时,对n/2取一个大数,对后来的结果更准确*/ 
        else k=n/2;
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&w[i]);
            sum+=w[i];
        }
        f[0][0]=f[1][0]=true;
        if(sum%2==1) summ=(sum+1)/2;
        else summ=sum/2;
        for(int i=1;i<=n;++i)/*除了DP方程以外,其余类似于01背包*/
          for(int j=summ;j>=w[i];--j)
            for(int q=k;q>=1;--q)
            f[q][j]=f[q][j]||f[q-1][j-w[i]];/*当前q个人,能否到达j这个质量,是看q-1人所能到达的质量和当前这个人的质量*/
        int t;
        for(int j=summ;j>=0;--j)
        {
            if(f[k][j])/*注意f是bool型数组,j才是最后的值*/
            {
                t=j;
                break;
            }
        }
        cout<<min(t,sum-t)<<" "<<max(t,sum-t)<<endl;
        return 0;
     } 
    View Code
  • 相关阅读:
    XP下关于快速切换用户功能的相关编程
    CRC原理及其逆向分析方法
    爱的十个秘密4.给予的力量
    爱的十个秘密1.序幕
    隐式链接无.LIB动态链接库
    电影图标黑客帝国(The Matrix)
    手机图标
    圣斗士图标:十二星座黄金圣衣
    MAC风格图标
    GB码与BIG5
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5304170.html
Copyright © 2011-2022 走看看