【问题标题】:Iterating an array 2 ways with minimal waiting time (dynamic programming)以最短的等待时间迭代数组 2 种方式(动态编程)
【发布时间】:2021-06-11 21:15:24
【问题描述】:

给定一个大小为 n 的整数数组。 整数代表完成某项工作的时间。 两名工人需要在最短的时间内完成这些工作,尽管他们不能重叠。 假设给定的数组大小为 4,数字为 1、2、4、5。第一个工人按照 [1] [4] [2] [3] 的顺序完成工作,第二个工人按照 [2] [3] [4] [1] 的顺序完成工作。所以完成这些工作所需的最少时间是 12 个单位,因为没有重叠。

如果数组大小为 3,数字为 1、2、4。第一个工作人员按顺序 [1][2][3] 执行作业,第二个工作人员按顺序执行工作 [3][1][2] , 但有个问题。一旦第一个工人完成了工作 2(经过 3 个单位时间),第二个工人仍在做工作 3,所以第一个工人必须等待 1 个单位才能让第二个工人完成他的工作。因此,完成这些工作所花费的最少时间是 1+2+4+1 单位等待 = 8 个单位。

我可以知道采取什么样的方法来解决这个问题吗?我正在使用 C++

【问题讨论】:

  • 我能知道采取什么样的方法来解决这个问题吗?我正在使用 c++——这个问题与 C++ 无关。这是一个算法问题,与任何语言无关。它要求你写下如何解决问题的计划——一旦你有了这个计划,然后就涉及如何用 C++(或任何语言)实现该计划的问题。

标签: c++ arrays algorithm optimization dynamic-programming


【解决方案1】:

在这个问题中,我们必须以等待时间最短的方式将工作分配给工人 A 和工人 B。

这个问题的最佳情况是将时间(总时间)/2 的工作分配给第一个工作人员,将剩余的工作分配给另一个工作人员。但我们不能这样做,因为一项工作只能由一个人完成。

所以我们会找到总时间最接近总时间一半的工作子集,这样我们可以最大限度地减少等待时间。

#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001];

int fun(int arr[],int n,int t,int sum)
{
if(n==0 || sum==0)
return t;

if(dp[n][t]!=-1)
return dp[n][t];


if(t+arr[n-1]<=sum)
{
  return dp[n][t]=max(fun(arr,n-1,t+arr[n-1],sum),fun(arr,n-1,t,sum));
}

else
return dp[n][t]=fun(arr,n-1,t,sum);

}
int main()
{

int size;
cin>>size;

int arr[size];
for(int i=0;i<size;i++)
cin>>arr[i];

int total=0;

for(int i=0;i<size;i++)
total+=arr[i];

memset(dp,-1,sizeof(dp));
int lower=fun(arr,size,0,total/2);

int ans= lower+(total-lower)+abs(lower-(total-lower));
cout<<ans<<endl;

return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多