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;
 } 

时间: 2024-12-08 15:59:36

codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品的相关文章

1959 拔河比赛

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight

codevs1959拔河比赛(二维费用背包)

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450).

c 指针 及其位运算循环移动拔河比赛问题代码

week_2_day1_7.7 周一//用字符数组 来实现 字母大小写转换#include<stdio.h>void desc( char *a ,int n){    char  *i = a;    int x = 0 ;    for ( x = 0; x < n ;x ++ )    {                    if ( *i  >= 97 )                        *i-=32;        i++;    }}int main(v

拔河比赛

描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近.输入格式 Input Format 输入数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight<=450).输出格式 Output Format 输出数据应该包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开.注意

LeetCode:Contains Duplicate - 判断数组内是否有重复元素

1.题目名称 Contains Duplicate(判断数组内是否有重复元素) 2.题目地址 https://leetcode.com/problems/contains-duplicate/ 3.题目内容 英文:Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in

如何判断微信内置浏览器(通过User Agent实现)

在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko)

外挂技术-编写代码判断背包是否已满

学习目标: 编写函数统计背包MP药品数量 DWORD GetAllMpGoodsNum(); 编写函数判断 背包是否装满 BOOL IsFullBackPack();//背包满 返回TRUE 未满返回FALSE 作业: 当金创药 总数<10 回城补给 100金创药(小); DWORD TBACKPACK_LIST::GetAllMpGoodsNum() { DWORD ndAllGoodsNum=0; ndAllGoodsNum+=GetHpGoodsNumForName("人参"

LeetCode:Contains Duplicate II - 判断数组内是否有重复元素2

1.题目名称 Contains Duplicate II(判断数组内是否有重复元素2) 2.题目地址 https://leetcode.com/problems/contains-duplicate-ii/ 3.题目内容 英文:Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nu

如何判断微信内置浏览器

如何判断微信内置浏览器 转自:http://blog.wpjam.com/m/is_weixin/ 进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like