欢迎来到Vijurria的博客|

Vijurria

园龄:2年11个月粉丝:6关注:2

洛谷 P2663 越越的组队(dp)

https://www.luogu.com.cn/problem/P2663

题目大意:

给定n个人

以及n个人的成绩

要求我们选出一半的人

达到总成绩一半的最大值
输入 #1复制
8
77
77
56
77
84
77
56
46
输出 #1复制
273
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
LL n,a[N],sum=0;
LL f[M][M];
//f[i][j]表示使用i个学生能否取到j这个成绩和
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        f[0][0]=true;
        for(int i=1;i<=n;i++)//每个人都跑一遍
        {
            for(int j=i;j>=1;j--)//从当前这个人开始往前面跑一遍
            {
                //k表示学生的编号
                for(int k=sum;k>=a[i];k--)//本来需要是三维的,这里采用逆序可以简化掉一维
                {
                    //或操作,有一个一即为一
                    f[j][k]|=f[j-1][k-a[i]];
                }
                //f[j][k]表示使用j个学生能否取到k这个成绩和
            }
        }
        sum/=2;
        n/=2;
        for(int i=sum;i>=0;i--)
        {
            if(f[n][i])
            {
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

本文作者:Vivian-0918

本文链接:https://www.cnblogs.com/Vivian-0918/p/16690118.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Vijurria  阅读(84)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起