蓝桥杯 ADV-15 算法提高 最大乘积

算法提高 最大乘积  

时间限制:1.0s   内存限制:512.0MB

问题描述

  对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?

输入格式

  第一行一个数表示数据组数
  每组输入数据共2行:
  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。

输出格式

  每组数据输出1行,为最大的乘积。

样例输入

1
5 5
1 2 3 4 2

样例输出

48

#include <cstdio>
#include <climits>
#include <vector>

using namespace std;

int n, m;
int a[20];
int max_prod;
vector<int> chosen_idx;

void find_max_prod(int current_idx, int num_chosen)
{
    if (num_chosen == m)
    {
        int prod = 1;
        for (int i = 0; i < chosen_idx.size(); ++i)
            prod *= a[chosen_idx[i]];
        if (prod > max_prod)
            max_prod = prod;
    }
    else if (current_idx >= n)
        return;
    else
    {
        chosen_idx.push_back(current_idx);
        find_max_prod(current_idx + 1, num_chosen + 1);
        chosen_idx.pop_back();
        find_max_prod(current_idx + 1, num_chosen);
    }
}

int main()
{
    int T;
    scanf("%d", &T);

    while (T--)
    {
        scanf("%d %d", &n, &m);
        for (int i = 0; i < n; ++i)
            scanf("%d", &a[i]);

        max_prod = INT_MIN;
        chosen_idx.clear();
        find_max_prod(0, 0);
        printf("%d\n", max_prod);
    }

    return 0;
}
发布了223 篇原创文章 · 获赞 40 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/104072480
今日推荐