倒水


小S面前有\(n\)个玻璃杯,每杯里都有水。

现在,小S想要把这\(n\)杯里的水互相倒,最终使得只有\(k\)个杯子里有水。

易知从把水从第i个玻璃杯倒到第j个花费是\(C_{i,j}\),求最小花费。

输入格式
第一行两个整数\(n,m\)

接下来\(n\)行,每行长度为\(m\)的自然数,表示\(C_{i,j}\)
输出格式
一个整数表示答案。

样例1
input

3 2
0 1 1
1 0 1
1 1 0

output

1

样例2
input

5 2
0 5 4 3 2
7 0 4 4 4
3 3 0 1 2
4 3 1 0 5
4 5 5 5 0

output

5

数据范围
40%的数据:\(n≤10\)
100%的数据:\(1≤k≤n≤20,C_{i,j}≤10^5\)
时间限制:2S

空间限制:32MB

倒水的状态可以压成二进制,然后考虑两种倒水状态如何互相转移。

初始化所有都有的情况下肯定是0的,即\(f_{2^i-1}=0\)
然后每一种肯定是一个有水的的倒到了另一个杯子,也就是枚举那个杯子倒到了那个杯子,然后状态转移。
最后统计只有一个杯子有水的状态的最小值就可以了。

#include
#include
#include
using namespace std;
const int N=21;
int dp[1<=1;i--,cnt=0)
	{
		for(int j=1;j<=n;j++)
		{
			if(i&(1<