https://ac.nowcoder.com/acm/contest/874/E
n个球放在m个箱子中,花费为箱子倒出的球数。求最小花费
#include<bits/stdc++.h>
using namespace std;
const int maxx=20;
int a[maxx][maxx],c[maxx],f[1<<maxx][maxx];
int dp[1<<maxx];
int main() {
int t;
cin>>t;
while(t--) {
int n,m;
cin>>n>>m;
memset(a,0,sizeof a);
memset(dp,0x3f,sizeof (int)*(1<<m));
memset(f,0,sizeof (int)*(1<<m)*(20));
memset(c,0,sizeof c);
int need=0;
for(int i=1; i<=n; i++) {
int x,y;
scanf("%d%d",&x,&y);
x--,y--;
a[x][y]++;
if(x!=y) need|=1<<x;
c[x]++;
}
dp[0]=0;
for(int i=0; i<1<<m; i++) {
for(int j=0; j<m; j++) {
if((i&(1<<j))) {
for(int k=0; k<m; k++) {
f[i][k]+=a[j][k];
}
}
}
}
for(int i=0; i<(1<<m); i++) {
for(int j=0; j<m; j++) {
if((i&(1<<j))) continue;
dp[i|1<<j]=min(dp[i|1<<j],dp[i]+c[j]+f[i][j]);
}
}
printf("%d\n",dp[need]);
}
}