基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
在公司年会上,做为互联网巨头51nod掌门人的夹克老爷当然不会放过任何发红包的机会。
现场有n排m列观众,夹克老爷会为每一名观众送出普通现金红包,每个红包内金额随机。
接下来,夹克老爷又送出
最多k组高级红包,每
组高级红包会同时给一排或一列的人派发 ,每
个高级红包的金额皆为x。
派发高级红包时,普通红包将会强制收回。同时,每个人只能得到一个高级红包。(好小气!)
现在求一种派发高级红包的策略,使得现场观众获得的红包总金额最大。
Input
第一行为n, m, x, k四个整数。 1 <= n <= 10, 1 <= m <= 200 1 <= x <= 10^9,0 <= k <= n + m 接下来为一个n * m的矩阵,代表每个观众获得的普通红包的金额。普通红包的金额取值范围为1 <= y <= 10^9
Output
输出一个整数,代表现场观众能获得的最大红包总金额
Input示例
3 4 1 5 10 5 7 2 10 5 10 8 3 9 5 4
Output示例
78
Code:
/*
直接暴力 会WA ,可先暴力n行,再计算列
*/
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAX_N=15;
const int MAX_M=205;
int n,m,S;
LL x;
LL a[MAX_N][MAX_M];
LL sum[MAX_M];
int main()
{
cin>>n>>m>>x>>S;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
cin>>a[i][j];
sum[j]+=a[i][j];
}
int t=1;
for(int i=0;i<n;++i)
t*=2;
t--;
LL Max=0;
while(t>=0){
int k=0,p=t--;
LL sumi[MAX_M];
for(int i=0;i<m;++i)
sumi[i]=sum[i];
for(int i=0;p;p>>=1,++i)
if(p&1){
k++;
for(int j=0;j<m;++j)
sumi[j]+=x-a[i][j];
}
if(k<=S){
sort(sumi,sumi+m);
LL ss=0;
for(int i=0;i<m;++i)
if(i<S-k) ss+=max(sumi[i],n*x);
else ss+=sumi[i];
Max=max(Max,ss);
}
}
cout<<Max<<endl;
return 0;
}