为N人选择N个东西,给你一个NxN矩阵和每个元素的成本,你需要找到一个具有最大总重量的组合,这样每个人才能得到一件事。
我发现制作dp状态很困难。 请帮助我,如果可能的话,还要为它编写代码
答案 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所说,在询问之前尝试自己尝试解决问题。
编辑:可以通过记忆减少到多项式时间。