问题描述
有一款有趣的手机游戏。棋盘上有n颗地雷,玩家需要至少扫掉其中的k颗雷。
每一步,玩家可以用手指在手机屏幕上划一条直线,该直线经过的地雷都会被扫除掉。
问,最少需要划几次就能扫除k颗以上的地雷?
输入格式
有两组测试数据,对于每组数据:
第一行,一个整数n,表示地雷的总数
第二含,一个整数k,表示至少需要扫掉的雷数
接下来n行,每行两个整数x和y,表示一颗地雷的坐标。
输出格式
两行,每行一个整数,表示对应数据的答案
样例输入
4
4
1 1
1 2
2 1
2 2
9
7
1 1
2 2
1 3
3 1
3 3
4 1
4 2
4 3
4 5
样例输出
2
2
提示
对于30%的数据, 1<=n<=8 , 1<=k<=n , -10000<=x,y<=10000
对于100%的数据,1<=n<=16 , 1<=k<=n , -10000<=x,y<=10000
【题目分析】
观察题目,n最大为16,两点确定一条直线,最多可画出162条直线。
我们暴力枚举所有直线,统计出每条直线穿过的点数。
每条直线最多穿过16个点,我们用二进制来实现状态压缩。
我们把n个点编号0到n - 1,用Line[i][j]记录编号i和j的点对应直线穿过的节点集合。
用结构体存下每一个点的坐标,
for(
叉乘−
背包DP
【传送门】http://oi.nks.edu.cn/zh/Problem/Details?id=3751