夹克爷发红包

来源:互联网 发布:java中的tag 编辑:程序博客网 时间:2024/04/28 02:43
在公司年会上,做为互联网巨头51nod掌门人的夹克老爷当然不会放过任何发红包的机会。

现场有n排m列观众,夹克老爷会为每一名观众送出普通现金红包,每个红包内金额随机。

接下来,夹克老爷又送出最多k组高级红包,每高级红包会同时给一排或一列的人派发 ,每高级红包的金额皆为x。

派发高级红包时,普通红包将会强制收回。同时,每个人只能得到一个高级红包。(好小气!)

现在求一种派发高级红包的策略,使得现场观众获得的红包总金额最大。
Input
第一行为n, m, x, k四个整数。1 <= n <= 10, 1 <= m <= 2001 <= x <= 10^9,0 <= k <= n + m接下来为一个n * m的矩阵,代表每个观众获得的普通红包的金额。普通红包的金额取值范围为1 <= y <= 10^9
Output
输出一个整数,代表现场观众能获得的最大红包总金额
Input示例
3 4 1 510 5 7 210 5 10 83 9 5 4
Output示例

78

#include <iostream>#include <cstring>#include <algorithm>using namespace std;int input[10][200];int count(int num){    int result = 0;    while (num)    {        result++;        num &= (num-1);    }        return result;}long long int fun(int n, int m, int x, int k){    int total = 1 << n;    long long int result = 0;    long long int sum[m+1];        for (int i = 0; i < total; i++)    {        int lineNum = count(i);        if (lineNum > k)        {            continue;        }                memset(sum, 0, sizeof(sum));        for (int j = 0; j < n; j++)        {            for (int k = 0; k < m; k++)            {                if (i & (1 << j))                {                    sum[k] += x;                }                else                {                    sum[k] += input[j][k];                }            }        }                sort(sum, sum + m);                int leftNum = k - lineNum;                long long int temp = 0;        for (int j = 0; j < m; j++)        {            if ((j+1) <= leftNum && sum[j] < n*x)            {                leftNum--;                temp += n*x;            }            else            {                temp += sum[j];            }        }                result = max(result, temp);    }        return result;}int main(){    int n, m, x, k;    cin >> n >> m >> x >> k;        for (int i = 0; i < n; i++)    {        for (int j = 0; j < m; j++)        {            cin >> input[i][j];        }    }    cout << fun(n, m, x, k) << endl;return 0;}


原创粉丝点击