Algorithm 任务分配的动态规划算法
我正在努力解决这个问题。我试图通过简单的递归来解决这个问题,但是对于大型案例来说,它所花费的时间是巨大的,我想通过编写一个动态编程算法来改进它 有Algorithm 任务分配的动态规划算法,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我正在努力解决这个问题。我试图通过简单的递归来解决这个问题,但是对于大型案例来说,它所花费的时间是巨大的,我想通过编写一个动态编程算法来改进它 有n给定的学生和n给定的任务。每个学生都由长度为n的1d数组表示,数组长度为0s和1sA[i]==0表示该学生无法完成i的第项任务,A[i]==1表示该学生可以完成i的第项任务。目标是确定有多少种不同的方式以一种方式分配任务给学生,所有任务都可以完成,单个学生只完成一项任务 我将非常感谢任何关于如何用动态规划方法处理这个问题的提示。您的问题看起来确实像是
n
给定的学生和n
给定的任务。每个学生都由长度为n的1d数组表示,数组长度为0
s和1
sA[i]==0
表示该学生无法完成i
的第项任务,A[i]==1
表示该学生可以完成i
的第项任务。目标是确定有多少种不同的方式以一种方式分配任务给学生,所有任务都可以完成,单个学生只完成一项任务
我将非常感谢任何关于如何用动态规划方法处理这个问题的提示。您的问题看起来确实像是一个二部图(图论)的匹配问题,其中学生是一个节点,任务是另一个节点(来自另一个集合)。边表示它们之间的兼容性。我没有任何解决方案,但你们可以找到一些关于匹配问题和动态规划的好东西 cin>>n;
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];
INTA[n+1][n+1];
对于(i=1;ia[i][j];
}
int dp[(1输入输出示例以获得更清晰的解释?输入的界限是什么?如果您给出递归解决方案,我相信将其转换为dp解决方案将非常简单?
dp[mask]+=dp[mask^(1<<i)];