#P1873. The Fortified Forest

The Fortified Forest

描述

从前,在一个遥远的国度里住着一位国王。这位国王拥有一小片珍稀且价值连城的树木,这些树是他的祖先在旅途中收集来的。为了保护这些树不被盗,国王下令在周围建造一道高高的围栏。他的巫师被委以重任。

然而,巫师很快发现,建造围栏唯一可用的材料就是这些树木本身的木材。换句话说,必须砍掉一些树才能用它们的木材为剩下的树建造围栏。当然,为了避免掉脑袋,巫师希望被砍伐的树木总价值最小。巫师回到他的塔楼,潜心研究,直到找到最优的解决方案。围栏建成后,大家从此过上了幸福的生活。

你需要编写一个程序来解决巫师面临的问题。

输入

输入包含多个测试用例,每个用例描述一片假设的森林。每个测试用例的第一行是一个整数 n2n15n(2 ≤ n ≤ 15),表示森林中的树木数量。树木编号为 1 至 nn。接下来的 nn 行每行包含 4 个整数 xi,yi,vi,lixi, yi, vi, li,描述一棵树的信息:

  • (xi,yi)(xi, yi) 表示树在平面上的坐标
  • vivi 表示树的价值
  • lili 表示用该树的木材能建造的围栏长度

vivilili 的取值范围是 0 到 10,000。

输入以 n=0n = 0 的空测试用例结束。

输出

对于每个测试用例,计算一个树木子集,使得:

  1. 用该子集的木材建造围栏,能围住剩下的所有树
  2. 该子集的总价值最小
  3. 如果存在多个最小价值子集,选择砍伐数量最少的那个

假设树的直径为 0(即视为点)。

输出格式如下:

  • 测试用例编号(1, 2, ...)
  • 被砍伐的树木编号
  • 围栏材料的剩余长度(保留两位小数)

测试用例之间用空行分隔。

输入数据 1

6
 0  0  8  3
 1  4  3  2
 2  1  7  1
 4  1  2  3
 3  5  4  6
 2  3  9  8
3
 3  0 10  2
 5  5 20 25
 7 -3 30 32
0

输出数据 1

Forest 1
Cut these trees: 2 4 5 
Extra wood: 3.16

Forest 2
Cut these trees: 2 
Extra wood: 15.00