一共有2^N次情况,全部枚举算一下就OK,最后的状态必须要灯全灭,然后再比分数,这里我用的二进制位模拟的开灭灯操作,即101表示改变1号3号灯,2号灯不变,具体看代码,不过没注释目测难看懂。。见谅
#include<stdio.h>
#include<string.h>
int main()
{
int n, map[10][10], f[10], lamp[10];
double m;
while (scanf("%d %lf", &n, &m), n && m)
{
memset(map, 0, 10 * 10 * sizeof(int));
int i, j, k, t;
for (i = 0; i < n; i++)
{
scanf("%d", &t);
for (j = 0; j < t; j++)
scanf("%d", &map[i][j]);
scanf("%d", &f[i]);
}
double max = -1;
for (i = 0; i < 1 << n; i++)
{
memset(lamp, 1, 10 * sizeof(int));
double res = m;
for (j = 0; j < n; j++)
if ((i >> j) & 1)
{
lamp[j] = !lamp[j];
for (k = 0; map[j][k] != 0; k++)
lamp[map[j][k] - 1] = !lamp[map[j][k] - 1];
res = res * (100 - f[j]) / 100;
}
for (j = 0; j < n; j++)
if (lamp[j])
break;
if (j == n && res > max)
max = res;
}
if (max != -1)
printf("%.2lf\n", max);
else
puts("-1");
}
return 0;
}