Algorithm 选择要做的任务以赚取尽可能多的钱

Algorithm 选择要做的任务以赚取尽可能多的钱,algorithm,time-complexity,Algorithm,Time Complexity,我无法解决这个问题: 你被赋予了n个任务 每个任务都有时间t,表示完成任务所需的时间(t[i]是第i个任务所需的时间) r[i]表示第i个任务的截止日期(我们从时间=0开始,r[i]是一个整数,表示任务必须完成的时间) 如果任务在截止日期前完成,您将获得任务i的奖励p[i] 您需要计算通过执行这些任务组合可以获得的最大报酬 只有在满足截止日期的情况下,才会给予奖励 所有值都是整数 解决方案必须具有尽可能低的复杂性 我尝试应用贪婪方法,但我意识到该算法并不总是给出最优解。我可以写一个暴力算法,

我无法解决这个问题:

  • 你被赋予了n个任务
  • 每个任务都有时间t,表示完成任务所需的时间(t[i]是第i个任务所需的时间)
  • r[i]表示第i个任务的截止日期(我们从时间=0开始,r[i]是一个整数,表示任务必须完成的时间)
  • 如果任务在截止日期前完成,您将获得任务i奖励p[i]
  • 您需要计算通过执行这些任务组合可以获得的最大报酬
  • 只有在满足截止日期的情况下,才会给予奖励
  • 所有值都是整数
  • 解决方案必须具有尽可能低的复杂性

我尝试应用贪婪方法,但我意识到该算法并不总是给出最优解。我可以写一个暴力算法,但这不是重点。我认为可以使用动态规划,但我不知道如何使用。

如果所有时间都相等,那么系统可以显示为拟阵,贪婪算法将给出最佳结果(参见Charles E.Leiserson、Thomas H.Cormen、Clifford Stein和Ronald Rivest的“算法简介”第16章)

然而,假设时间不相等,一般情况下,该问题是NP难问题

要知道为什么,考虑所有的期限是固定值的情况。然后,该问题等价于找到将项目打包到固定时间预算中的最佳方法,并等价于已知的NP完全问题

在您的特定情况下,时间是整数,因此您可以调整时间


我建议尝试使用基于子问题f(t)的动态规划来解决这个问题,这是调度截止日期小于或等于t的所有任务的最小惩罚。

我使用动态规划来解决它f[i]是您在i第小时可以获得的最大奖励。解决方案是f[max(r)],其中max(r)是截止日期的最大值

在我的解决方案中,您还需要一个列表X[i],其中X[i]表示在i第小时您应该完成的任务的最佳列表,以获得最大奖励

以下是伪代码:

LIST x0...n = empty;  // x0, x1....xn are all different lists
f[0] = 0;
for i=1 to max(r) do
    max = f[i-1];
    x[i] = x[i-1];
    for j=1 to n do
        if t[j] <= i and r[j] >= i and j.isNotElementOf(x[f[i-t[j]]]) then
            reward = p[j] + f[i-t[j]];
            if reward > max then
                max = reward;;
                x[i] = x[i-t[j]];
                x[i].add(j);
    f[i] = max;
return f[max(r)];
列表x0…n=空;//x0,x1…xn都是不同的列表
f[0]=0;
对于i=1至最大(r)do
max=f[i-1];
x[i]=x[i-1];
对于j=1到n do
如果t[j]=i且j.isNotElementOf(x[f[i-t[j]]),则
奖励=p[j]+f[i-t[j]];
如果奖励>最大值,则
最大值=奖励;;
x[i]=x[i-t[j];
x[i].添加(j);
f[i]=最大值;
返回f[max(r)];

谢谢您的建议。这有帮助。事实上,我用改进的背包动态规划方法解决了这个问题。