【问题标题】:Dynamic programming algorithm for assigning tasks分配任务的动态规划算法
【发布时间】:2019-09-20 13:23:16
【问题描述】:

我正在努力解决这个问题。我尝试通过简单的递归来解决它,但是大型案例所花费的时间很长,我想通过编写动态编程算法来改进它。

n 给定学生和n 给定任务。每个学生都由0s 和1s 中的1d array of length n 代表。 A[i] == 0 表示该学生无法完成i'th 任务,A[i] == 1 表示该学生可以完成i'th 任务。目标是确定有多少种不同的方式以某种方式将任务分配给学生,所有任务都可以完成,单个学生只能完成一项任务。

我将不胜感激有关如何以动态编程方式解决此问题的任何提示。

【问题讨论】:

  • 示例输入输出以获得更清晰的解释?
  • 输入的界限是什么?
  • 如果您提供递归解决方案,我相信将其转移到 DP 解决方案会很简单。

标签: algorithm dynamic-programming


【解决方案1】:

您的问题看起来确实像二分图(图论)的匹配问题,其中学生是一个节点,而任务是另一个(来自另一个集成)。边代表它们之间的兼容性。我没有任何解决方案,但您将能够找到一些关于匹配问题和动态规划的好东西。

【讨论】:

    【解决方案2】:
        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 的状态是 (mask),其中 x 表示直到 x 的那个人已经被分配了一个任务,它也等于 mask 的 setbits,并且 mask 是一个二进制数,它的每个位表示该任务是否已经被分配.

    如果第 i 位未设置并且第 x 人可以完成这项工作

        dp[mask]+=dp[mask^(1<<i)];
    

    时间复杂度为 O(N*2^N),空间复杂度为 O(2^N)

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2013-11-27
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多