题目描述
班级要组织一场综合能力竞赛,全班同学(N(100以内)个,N是偶数)分成两队互相竞争。老师找到了越越并给了越越一张全班同学综合能力测试的成绩,要求他从全班同学中选出一半(他自己也可能被选),并要求这些同学综合能力测试的成绩之和在不超过班级总分一半的前提下尽量达到最高。这样分成的两队实力是最平均的。越越堆着满脸的笑容找到了你,你就帮他写一个程序吧。
输入输出格式
输入格式:第一行:学生个数N;第二行开始的N行每行一个同学的综合能力测试的成绩。
输出格式:输出一个数:N/2个同学的综合能力测试的成绩之和在不超过班级总分一半的前提下尽量达到的最高值。
输入输出样例
输入样例#1:
8 77 77 56 77 84 77 56 46
输出样例#1:
273
说明
样例解释:总分550;总分的一半275;选择4名同学56 77 84 56 77 达到总分273;273是不超过275的最大值。(另一队的和是277)两队实力最接近。
以下是我的代码(和题解差不多)【AC了】:
#include<bits/stdc++.h>
using namespace std;
int i,j,n,s,a[200],f[30000],ans;
int main(){
scanf("%d",&n);
for (i=1;i<=n;i++) {scanf("%d",&a[i]); s+=a[i];}
s/=2;
for (i=1;i<=n;i++)
for (j=s;j>=a[i];j--){
f[j]=max(f[j],f[j-a[i]]+a[i]);
if (f[j]>ans) ans=f[j];
}
printf("%d\n",ans);
return 0;
}
但是数据好像不太严格,如果有数据:
6
1
2
3
4
5
16
那么我的代码和题解都会WA掉(输出15)
所以?