问题描述 :
对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入说明 :
第一行一个数表示数据组数
每组输入数据共2行:
第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15【我感觉这里题目应该是错了,应该是m<=n】
第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4【这里就是每个数的绝对值小于等于4】。
输出说明 :
每组数据输出1行,为最大的乘积。
输入范例 :
1
5 5
1 2 3 4 2
输出范例 :
48
完整C++代码
一道经典的深度优先搜索题目,dfs秒了
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vec;
int T, n, m, max_mul;
int num[30], visit[30] = {0}, res[30];
void dfs(int step) {
if (step == m) {
// 临时乘积
int mul = 1;
for (int i = 0; i < m; i++) {
mul *= res[i];
}
// 取最大值
max_mul = max(max_mul, mul);
return;
}
for (int i = 0; i < n; i++) {
if (visit[i] != 0) continue;
res[step] = num[i];
visit[i] = 1;
dfs(step + 1);
visit[i] = 0;
}
}
int main() {
cin >> T;
while (T--) {
// 因为可能都是负数,所以最大值要先设为负
max_mul = -0x3f3f3f;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> num[i];
}
dfs(0);
cout << max_mul << endl;
}
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋