给出了NxN矩阵,我们必须找到

时间:2015-08-14 20:56:29

标签: dynamic-programming

为N人选择N个东西,给你一个NxN矩阵和每个元素的成本,你需要找到一个具有最大总重量的组合,这样每个人才能得到一件事。

我发现制作dp状态很困难。 请帮助我,如果可能的话,还要为它编写代码

1 个答案:

答案 0 :(得分:0)

C ++样式代码:

double max_rec(int n, int r, int* c, double** m, bool* f)
{
    if (r < n)
    {
        double max_v = 0.0;
        int max_i = -1;
        for (int i = 0; i < n; i++)
        {
            if (f[i] == false)
            {
                f[i] = true;
                double value = m[r][i] + max_rec(n, r + 1, c, m, f);
                if (value > max_v)
                {
                    max_v = value;
                    max_i = i;
                }
                f[i] = false;
            }
        }
        c[i] = max_i;
        return max_v;
    }
    return 0.0;
}

int* max_comb(int n, double** m)
{
    bool* f = new bool[n];
    int* c = new int[n];
    max_rec(n, 0, c, m, f);
    delete [] f;
    return c;
}

用N和你的NxN矩阵(2d数组)调用max_comb。返回最大组合的列索引。

时间复杂度:O(N!) 我知道这很糟糕,但问题没有贪婪的结构。

正如@mszalbach所说,在询问之前尝试自己尝试解决问题。

编辑:可以通过记忆减少到多项式时间。