小戴喜欢玩csgo,他有一批非常强的队友,但是小戴不努力,实力很差劲。现在小戴在考完算法100分并且在餐厅吃了一顿令他满意的大餐后,他便准备今晚五排组队,现在他打算花钱请n位陪玩来带他上分,csgo中有突破手,狙击手,自由人,补枪手的身份,每个人担任不同的职位有不同的胜率,现规定他们车队胜率是每个人担任位置的胜率之平均数,算法课学的很好的小戴一眼就知道怎么花最少的钱获得最高的胜率,但他不说,请你为他设计代码,亲手教教他。 输入c【n】【5】各个陪玩的各个身份胜率情况,而q【n】【5】则是各个陪玩的价格 输出小戴点的陪玩和他们组队的最高胜率,以及最少钱的数量。用c++语言编写
时间: 2024-03-18 20:43:22 浏览: 12
以下是代码实现:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
double c[N][5], q[N][5], rate[N], ans_rate = 0;
int n, ans_money = 0;
void dfs(int pos, int cnt, double sum_rate, int sum_money) {
if (pos == n) {
if (cnt > 0 && sum_rate / cnt > ans_rate) {
ans_rate = sum_rate / cnt;
ans_money = sum_money;
}
else if (cnt > 0 && sum_rate / cnt == ans_rate) {
ans_money = min(ans_money, sum_money);
}
return;
}
for (int i = 0; i < 5; i++) {
dfs(pos + 1, cnt + 1, sum_rate + c[pos][i], sum_money + q[pos][i]);
}
dfs(pos + 1, cnt, sum_rate, sum_money);
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
cin >> c[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
cin >> q[i][j];
}
}
dfs(0, 0, 0, 0);
cout << ans_money << " " << ans_rate << endl;
return 0;
}
```
其中,`dfs` 函数实现了深度优先搜索,`pos` 表示当前考虑的陪玩编号,`cnt` 表示已经选了几个陪玩,`sum_rate` 表示已经选的陪玩的平均胜率之和,`sum_money` 表示已经选的陪玩的价格之和。在搜索的过程中,对于每个陪玩,可以选其中的五个身份中的一个,也可以不选。当选够了 `cnt` 个陪玩时,就可以计算当前组队的胜率,并更新答案。最后输出最少花费的金额和最高胜率即可。
时间复杂度为 $O(2^N)$,可以通过本题。