暴力枚举
观察数据范围,可以用枚举的方法
- 首先记录重量为 k 的人的数量,num[k]
- 枚举体重和 i,判断哪个体重和对应的组合最多;范围是 2 ~ 2*n(1<=k<=n)
- 枚举第一个人的重量 j,则第二个人的重量为 i - j ;
min( num[j], num[i-j] ) 即为该情况下能凑出的最多的组合数 - 对于每一种体重和都计算了2次,例如 min(num[1], num[3-1]) 和 min(num[2], num[3-2])
则 cnt / 2 为该体重和下的组合数量 - 对于每一种体重和的情况,ans取最大值
#include <bits/stdc++.h>
using namespace std;int main()
{int T; scanf("%d", &T);while(T--){int n, k, num[101], ans=-1; scanf("%d", &n);memset(num, 0, sizeof(num));for(int i=0; i<n; i++) { scanf("%d", &k); num[k]++;}// 枚举体重和for(int i=2; i<=2*n; i++){int cnt=0;// 枚举第一个人的体重for(int j=1; j<=i; j++)cnt+=min(num[j], num[i-j]);ans=max(ans, cnt/2);}cout<<ans<<endl;}//system("pause");return 0;
}