倒水
小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<