羽毛球隊有男女運動員各n人。給定2 個n×n矩陣p和q。p[i][j]是男運動員i和女運動員j配對組成混合雙打的男運動員競賽優勢;q[i][j]是女運動員i和男運動員j配合的女運動員競賽優勢。由於技術配合和心理狀態等各種因素影響,p[i][j]不一定等於q[j][i]。男運動員i和女運動員j配對組成混合雙打的男女雙方競賽優勢為p[i][j]*q[j][i]。設計乙個演算法,計算男女運動員最佳配對法,使各組男女雙方競賽優勢的總和達到最大。
第一行有1 個正整數n (1≤n≤20)。接下來的2n行,每行n個數。前n行是p,後n行是q。
將計算出的男女雙方競賽優勢的總和的最大值輸出。輸入3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
輸出搜尋
void dfs(int i, int sum)
從第乙個男生開始搜尋他與那個女生配對
搜尋到第n個男生時,用得到的優勢值更新答案f(j,1,n)
}
if(i == n + 1)
————不出意料tle
用max_sco[i]記錄第i個男生與女生配對得到的最大優勢值(是的,不考慮分配,就是那個最大的p[i][j]*q[j][i])
如果往下搜尋時,能得到的最大優勢值(其實是得不到的,只是找了個上限)比當前ans還小,那它怎麼也更新不了ans,剪掉f(i,1,n)
}
int max_ans = sum;
f(j,i,n) max_ans += max_sco[j];
if(max_ans < ans) return;
#include #include #include #include #include #include #include #define f(i,a,b) for(int i=a;i<=b;i++)
#define uf(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int n = 25;
int n, p[n][n], q[n][n], ans, max_sco[n];
bool vis[n];
void dfs(int i, int sum)
int max_ans = sum;
f(j,i,n) max_ans += max_sco[j];
if(max_ans < ans) return;
f(j,1,n) }}
int main()
f(i,1,n)
f(i,1,n)
} dfs(1,0);
cout << ans << endl;
return 0;
}
P1559 運動員最佳匹配問題
羽毛球隊有男女運動員各n人。給定2 個n n矩陣p和q。p i j 是男運動員i和女運動員j配對組成混合雙打的男運動員競賽優勢 q i j 是女運動員i和男運動員j配合的女運動員競賽優勢。由於技術配合和心理狀態等各種因素影響,p i j 不一定等於q j i 男運動員i和女運動員j配對組成混合雙打的...
洛谷p1559運動員最佳匹配問題
題目 搜尋 可行性剪枝 雖然這題目是我搜二分圖的標籤搜到的 但是n比較小 明顯可以暴力 然而只有80分 再加上可行性剪紙就行啦 就是記所有運動員他所能匹配到的最大值 在我們搜尋到第i層的時候 如果他後邊的運動員的最大值加起來還比當前已經搜到的最優解還小的話 就把他減掉 code bao li inc...
P1559 運動員最佳匹配問題 最大費用最大流
羽毛球隊有男女運動員各n人。給定2 個n n矩陣p和q。p i j 是男運動員i和女運動員j配對組成混合雙打的男運動員競賽優勢 q i j 是女運動員i和男運動員j配合的女運動員競賽優勢。由於技術配合和心理狀態等各種因素影響,p i j 不一定等於q j i 男運動員i和女運動員j配對組成混合雙打的...