题目描述
每个月,詹姆斯都会收到一些任务,根据他以前执行任务的经验,他计算出了每个吉米完成每个任务的成功率,要求每个任务必须分配给不同的人去完成,每个人只能完成一个任务。
请你编写程序找到一个分配方案使得所有任务都成功完成的概率。
题目解析
状压
枚举状态,状态中的个数就代表已经安排了个人,然后枚举第个人做在状态中的哪个任务。
设为安排第个人所做的任务,且&。
则,S$&
代码
#include<bits/stdc++.h>
using namespace std;
int n;
double f[1<<20],a[25][25];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
f[1<<(i-1)]=a[1][i];
for(int i=1;i<(1<<n);i++)
{
int t=0;
for(int j=i;j;j-=(j&-j),t++);
for(int j=0;j<n;j++)
if(i&(1<<j))
f[i]=max(f[i],f[i^(1<<j)]*a[t][j+1]/100);
}
printf("%0.6lf",f[(1<<n)-1]);
}
来源:https://blog.csdn.net/weixin_43909855/article/details/99109941