UVA 1508 - Equipment dp状态压缩

时间:2023-03-09 06:52:08
UVA 1508 - Equipment     dp状态压缩

题意:  已知n个5元组,从中选出k组,使得这些组中5个位置,每个位置上最大数之和最大。

分析:当k>5时,就是n个5元组最大的数之和,当k<5时,就当做5元组,状态压缩,用00000表示未选出5个最大值,11111表示已经选出了5个最大值,那么情况就一共有32种,然后枚举每种情况更新f[i][j]数组,f[i][j]数组储存选i组情况是j的最大值之和是多少,结果就是f[k][31]。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int a[][],f[][]; int main()
{
int t,n,k;
scanf("%d", &t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=;i<n;++i)
for(int j=;j<;++j)
scanf("%d",&a[i][j]);
k=min(k,);
memset(f,,sizeof(f));
for(int i=;i<=k;++i)
for (int j=;j<;++j)
for(int x=j;x;x=(x-)&j)
{
int tmp=j-x;
for(int l=;l<n;++l)
{
int sum=;
for(int m=;m<;m++)
if(x&(<<m))
sum+=a[l][m];
f[i][j]=max(f[i][j],f[i-][tmp]+sum);
}
}
printf("%d\n",f[k][]);
}
return ;
}