题目大意:有n个人, 每个人有自己的体重, 要求选出两队人, 人数差不超过1, 且重量差最小, 求出两队体重和;
其实很明白是DP, 但是DP状态转移方程却不太好想;
琢磨半天, 想到了随机化!!
贪心的去想 : 我们把n个人分成两份, 然后得出正确答案, 虽然可能一次达到正解的概率只有0.1%?, 但是重复无数次(不超时), 几乎可以达到100%!!!;
不说了, 看代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> using namespace std; int n, sum; int a[105]; int ans1 = 1e9, ans2 = -1e9; inline void Init() { for(register int i = 1 ; i <= n ; i ++) { int t = rand() % n + 1;; int tmp = a[t]; a[t] = a[i]; a[i] = tmp; } } inline void Work() { int s1 = 0, s2 = 0; for(register int i = 1 ; i <= n / 2 ; i ++) { s1 += a[i]; } s2 = sum - s1; if(abs(s1 - s2) < abs(ans1 - ans2)) { ans1 = min(s1, s2); ans2 = max(s1, s2); } } int main() { srand(23433); cin >> n; for(register int i = 1 ; i <= n ; i ++) { scanf("%d", &a[i]); sum += a[i]; } for(register int i = 1 ; i <= 100000 ; i ++) { Init(); Work(); } printf("%d %d\n", ans1, ans2); return 0; }