dfs+状压dp 现在一看到n<=8这种数据范围我就第一反应是状压了...
精度坑爹, 我写fabs(k)<eps就WA了, 害得我调了半天(摔
依然是要数据的私信.... 虽然这题目感觉没啥好调试的其实...
比前面一题题意上简单多了..
/*author: birdstorm*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <climits>
#define MAXN 1005
#define N 105
#define inf 1.0e20
#define eps 1.0e-8
#define MOD 1000000007
#define For(i,m,n) for(int i=(m);i<(n);i++)
#define vecfor(iter,a) for(vector<int>::iterator iter=a.begin();iter!=a.end();iter++)
#define rep(i,m,n) for(int i=(m);i<=(n);i++)
#define repd(i,m,n) for(int i=(m);i>=(n);i--)
#define LL long long
#define test
using namespace std;
double ans[390626], p[8][8];
int power[8], cnt[8], g[8*8];
int tail, d, n, cs=1;
double dfs(int x)
{
double &a=ans[x];
int tx=x;
if(a>=0) return a;
if(x==d) return a=1.0;
int staff[n], y=0;
a=0;
For(i,0,n){
staff[i]=tx%5;
tx/=5;
y+=staff[i];
}
if(y==tail) return a;
For(i,0,n){
if(staff[i]>=cnt[i]) continue;
a+=p[g[y]][i]*dfs(x+power[i]);
}
return a;
}
int main()
{
power[0]=1;
rep(i,1,7) power[i]=power[i-1]*5;
while(scanf("%d",&n),n){
tail=0; d=0;
For(i,0,390626) ans[i]=-1.0;
For(i,0,n) For(j,0,n) scanf("%lf",&p[i][j]);
For(i,0,n){
scanf("%d",&cnt[i]);
For(j,0,cnt[i]) g[tail++]=i;
d+=cnt[i]*power[i];
}
double k=dfs(0);
printf("Case %d: ", cs++);
if(k==0.0) printf("-INFINITY\n");
else printf("%.8lf\n",log(k));
}
return 0;
}