【发布时间】:2020-10-17 15:38:27
【问题描述】:
我无法理解如何解决这个问题。有人可以帮我指出我如何处理它的方向吗?
N 个任务被分配,并且有 M 个工人可用。每个工人可以花费不同的时间来完成每项任务。给出了每个工人完成每项任务所花费的时间。在任何时候,只有一名工人可以完成一项任务。但条件是一旦工人停止工作,他就不能再从事任何任务。我想知道完成所有任务所需的最短时间是多少。这是一个例子-
M = 3
N = 4 {T1, T2,T3,T4}
每个工作人员为每个任务 (Ti) 所需的天数 (Wi) -
有很多方法可以完成任务,其中一些是 -
- 所有任务都由 W1 完成 ===> 总耗时 = 1+2+2+3 = 8
- 所有任务都由 W2 完成 ===> 总耗时 = 3+1+3+2 = 9
- 所有任务都由 W3 完成 ===> 总耗时 = 1+1+6+6 = 14
- T1、T2、T3 由 W1 完成,T4 由 W2 完成 ===> 总时间 = 1+2+2+2 = 7
- T1、T2 由 W1 完成,T3、T4 由 W3 完成 ===> 总耗时 = 1+2+6+6 = 15
- T1,T2 由 W3 完成,T3 由 W1 完成,T4 由 W2 完成 ===> 总时间 = 1+1+2+2 = 6
有更多可能的方法,但花费最少的方法是第 6 种方法(如下图所示)。
当工人人数只有2人时,我才能够理解如何做到这一点。我是这样做的-
#include<iostream>
using namespace std;
int N=4,M=2;
int main()
{
int i,j,min=INT_MAX;
int sum,sum1;
int w0[N] = {1,2,2,3};
int w1[N] = {3,1,3,2};
for(i=0;i<N;i++)
{
sum=0;
sum1=0;
for(j=0;j<i;j++)
{
sum+=w0[j];
sum1+=w1[j];
}
for(j=N-1;j>=i;j--)
{
sum+=w1[j];
sum1+=w0[j];
}
if(sum<sum1)
{
if(min>sum)
min = sum;
}
else
{
if(min>sum1)
min = sum1;
}
}
cout<<min;
return 0;
}
我试图用下面的另一个表格来解释它-
但是这样我只能找到 2 个工人的最小值。我需要帮助来了解超过 2 名工人的方法。
是否还有可能的 DP 解决方案?
【问题讨论】:
-
你可以做的是创建一个矩阵,你可以在其中找到每个 [i][j] 的最小值。
-
你必须按照给定的顺序完成任务还是可以重新排序?
-
@Joni no tasks can't be reordered
-
@Carlos1232 你的意思是每个工人的最短时间吗?这有什么帮助?
标签: c++ algorithm recursion math dynamic-programming