枚举题 每行选或者不选,很容易想到二进制枚举
。。。就是调试要很久
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k,ans,ans2=0;
int a[20][20],b[20][20];
bool cmp(int a,int b)
{
return a>b;
}
void init()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>b[i][j];
}
int main()
{
init();
if(k>=min(n,m))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans+=b[i][j];
cout<<ans<<endl;
return 0;
}
for(int i=0;i<1<<n;i++)
{ ans=0;
int now=0;
for(int ii=1;ii<=n;ii++)
for(int j=1;j<=m;j++)
a[ii][j]=b[ii][j];
for(int j=0;j<n;j++)
{
if(i>>j&1)
{
now++;
for(int kk=1;kk<=m;kk++)
ans+=a[j+1][kk],a[j+1][kk]=0;
}
}
if(now>k)continue;
int sum[20]={0};
for(int j=1;j<=n;j++)
for(int kk=1;kk<=m;kk++)
sum[kk]+=a[j][kk];
sort(sum+1,sum+1+m,cmp);
for(int ii=1;ii<=k-now;ii++)
ans+=sum[ii];
ans2=max(ans2,ans);
}
cout<<ans2<<endl;
}

京公网安备 11010502036488号