又一年拔河比賽
阿新 • • 發佈:2020-11-27
一些廢話:
怎麼說寫完前兩道題再寫這道題思路就順暢多了。但還是寫了半個小時。
依然是 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; }