洛谷 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 中国大陆许可协议进行许可。
分类:
dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步