1. 程式人生 > 實用技巧 >又一年拔河比賽

又一年拔河比賽

一些廢話:

怎麼說寫完前兩道題再寫這道題思路就順暢多了。但還是寫了半個小時。

依然是 dfs 。。。和上兩道題思路挺像的。


首先,根據

拔河比賽兩邊人數最多不能相差 1。
可得:如果 n 是偶數那麼兩組的人數就只能相等,如果 n 是奇數那麼我們只要選出人數為 (n-1)/2 的一組就行了。 所以要選的人數即為 n/2 。 要使兩隊體重最接近,可以根據體重總和求出另一組的體重,不斷更新答案。 注意多組資料要每次給變數賦初值。 最後放下程式碼:
#include<bits/stdc++.h>
using namespace std;
int t,n,a[21],sum,ans = 1e9,b;
void dfs(int s,int t,int p)//傳遞到第幾位,目前的人數,目前的和 { if(s > n) return; if(t > n / 2) { ans = min(abs(2 * p - sum),ans); return; } dfs(s + 1,t + 1,p + a[s]); dfs(s + 1,t,p); return; } int main() { scanf("%d",&t); while(t --) { ans = 1e9;sum = 0
;//第一次就寫錯在這裡了qwq scanf("%d",&n); for(int i = 1;i <= n;i ++) { scanf("%d",&a[i]); sum += a[i]; } dfs(1,0,0); cout << ans << endl; } return 0; }