cin>>n;
int a[n+1][n+1];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
cin>>a[i][j];
}
int dp[(1<<n)];
memset(dp,0,sizeof(dp));
dp[0]=1;
for(mask=1;mask<(1<<n);mask++){
x=getbits(mask);
for(i=0;i<n;i++)
if(mask & (1<<i) && a[x][i+1]){
dp[mask]+=dp[mask^(1<<i)];
}
}
cout<<dp[(1<<n)-1];
Условием инициализации является dp [0] = 1
, поэтому состояние dp - (маска), где x обозначает, что человеку до x была назначена задача, которая также равна заданным битам маски, имаска - это двоичное число, каждый бит которого представляет, была ли назначена эта задача.
, если i-й бит не установлен и x-й человек может выполнить эту работу
dp[mask]+=dp[mask^(1<<i)];
Сложность времени равна O (N * 2 ^ N), а сложность пространства O (2 ^ N)