这题我是用的bfs做的,用到一个map,用来统计是否访问过和最大值的保存
#include <cstdio>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;
struct Data
{
int state;
double score;
};
int main(){
int i,j;
int m,n;
int re[12][12];
int f[12];
while(scanf("%d %d",&n,&m)!=EOF && n!=0){
for(i=0;i<11;i++)
for(j=0;j<11;j++)
re[i][j]=-1;
queue<Data> qqq;
map<int,double> sss;
for(i=0;i<n;i++){
int t;
scanf("%d",&t);
for(j=0;j<t;j++){
scanf("%d",&re[i][j]);
re[i][j]--;
}
scanf("%d",&f[i]);
}
Data temp;
temp.state=(1<<n)-1;
temp.score=m;
qqq.push(temp);
sss[temp.state]=temp.score;
sss[0]=-1.0;
double res=-1;
while(!qqq.empty()){
temp=qqq.front();
qqq.pop();
for(i=0;i<n;i++){
Data temp2=temp;
j=0;
temp2.state^=(1<<i);
while(re[i][j]!=-1){
temp2.state^=(1<<re[i][j]);
j++;
}
temp2.score=temp2.score*(1.0-f[i]/100.0);
if(sss.count(temp2.state)){
if(sss[temp2.state]<temp2.score)
sss[temp2.state]=temp2.score;
continue;
}
qqq.push(temp2);
sss[temp2.state]=temp2.score;
}
}
if(sss[0]<=-1.0)
printf("-1\n");
else
printf("%.2lf\n",sss[0]);
}
return 0;
}
/*
3 100
0 50
0 50
2 1 2 50
0 0
*/