回 帖 发 新 帖 刷新版面

主题:[讨论]动态规划题<我想了好多天了><高手进,初学者就别浪费时间了>

有两台机器a,b;有n个任务,对每个任务,可在a或b中的任一台上完成,且只能在一台上完成;
已知对第i个任务,其在a,b上运行所需时间分别为A[i],B[i],(一般情况下A[i]<>B[i])
求一种方案使时间最短(时间=任一台机器开始时间 到 最后一台机器结束时间)
样例输入:
n{任务个数}
n个integer{各任务在a上的运行时间}
n个integer{各任务在b上的运行时间}
样例输出:t{任务全部完成的最短时间}
样例输入
3
1 2 1
3 2 3
样例输出 
2
{一种可行的方案为:在a上处理任务1,3;
                  在b上处理任务2}
时间=max{a的运行时间,b的运行时间};
******如果有别的算法也可(枚举除外)******

回复列表 (共13个回复)

沙发

大概是:
~~~~~~~~~~~~~~
找a组中最小;
找b组中最小;
if a[i]<>b[i] then begin 将a累加到a总时间;将b累加到b总时间;a[i],b[i]清0; end;
~~~~~~~~~~~~~~~
if a总时间>b总时间 then writeln(a总);
else 输出b总


这是主体,其他的加上就行了.
用不着动态规划
:)

板凳


       能不能详细点?????

3 楼

真的,用不着规划。(如果任务没有顺序)
伪代码:
FOR EACH t in Tasks
  if a[t]>b[t] then
    b[t]=0
  else
    a[t]=0
  end if
end FOR

timeA = Sum(a)
timeB = Sum(b)
time = min(timeA + timeB)

4 楼

f(i):=min{f(i-1)+a[i],f(i-1)+b[i]}
f( 
i)为前i个任务最少时间

5 楼

独立任务最优调度问题
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ifstream fin("sched.in",ios::in);
    ofstream fou("sched.ou",ios::out);
    int n,resource[201][2];
    int i,before,j,k,jMax=0,finish,temp=0;
    bool ***p;
    
    fin >> n;
    for(i=0;i<2;i++)
        for(j=1;j<=n;j++)
        {
            fin >> resource[j][i];
            if(resource[j][i]>jMax)
                jMax=resource[j][i];
        }
    finish=jMax*=n;
    p = new bool **[2];
    for(i=0;i<2;i++)
    {
        p[i] = new bool *[jMax+1];
        for(j=0;j<=jMax;j++)
        {
            p[i][j]= new bool [jMax+1];
            for(k=0;k<=jMax;k++)
                p[i][j][k]=true;
        }
    }

//for(i=0;i<2;i++)
//    for(j=0;j<n;j++)
    
    for(i=1;i<=n;i++)
    {
        for(j=0;j<=jMax;j++)
        {
            for(k=0;k<=jMax;k++)
            {
                if(j>=resource[i][0]&&p[(i-1)%2][j-resource[i][0]][k]) p[i%2][j][k]=true;
                else if(k>=resource[i][1]&&p[(i-1)%2][j][k-resource[i][1]]) p[i%2][j][k]=true;
                else p[i%2][j][k]=false;
            }
        }
    }
    
    for(i=0;i<=jMax;i++)
    {
        for(j=0;j<=jMax;j++)
            if (p[n%2][i][j])
            {
                if(i>=j) temp=i;
                else     temp=j;
                if(temp<finish) finish = temp;
                break;
            }
    }
    fou << finish;
    return 0;
}

6 楼

晕呀,,,
LS的这么长。。。
[code]
 
   for(i= 1; i<= n ; i++)
   {
          if ( ta + a[i] < tb + b[i] )
          ta += a[i] ;
          else
          tb += b[i] ;
   }
[/code]

7 楼

[quote]
/*
有两台机器a,b;有n个任务,对每个任务,可在a或b中的任一台上完成,且只能在一台上完成;
已知对第i个任务,其在a,b上运行所需时间分别为A[i],B[i],(一般情况下A[i]<>B[i])
求一种方案使时间最短(时间=任一台机器开始时间 到 最后一台机器结束时间)
样例输入:
n{任务个数}
n个integer{各任务在a上的运行时间}
n个integer{各任务在b上的运行时间}
样例输出:t{任务全部完成的最短时间}
样例输入
3
1 2 1
3 2 3
样例输出 
2
{一种可行的方案为:在a上处理任务1,3;
                  在b上处理任务2}
时间=max{a的运行时间,b的运行时间};
*/

#include <stdio.h>
#define MAX 101

int main(void)
{
   int a[MAX]={0},b[MAX]={0},n ,ta= 0 , tb = 0 ;
   int i,j,k ;
   
   scanf("%d",&n);
   
   for(i= 1; i<= n ; i++)
   scanf("%d",&a[i]);
   for(i= 1; i<= n ; i++)
   scanf("%d",&b[i]);
   
   for(i= 1; i<= n ; i++)
   {
          if ( ta + a[i] < tb + b[i] )
          ta += a[i] ;
          else
          tb += b[i] ;
   }
   
   if ( ta > tb)
   printf("%d\n",ta);
   else
   printf("%d\n",tb);
    
    
   return 0 ;
}

[/quote]

8 楼


贪心的~~~不用动规

9 楼


我跟一楼的看法不一样,
如果测试数据是:
          3
          1 2 2
          3 4 3
   则
     A[1]<B[1]
         THEN 选A[1]
     A[2]<B[2]
         THEN 选A[2]
     A[3]<B[3]
         THEN 选A[3]
 {A[1]+A[2]+A[3]}=5 {都由A执行}
还不如 MIX{A[1]+A[2]+B[3]}=3  {在A执行1 与 2 时 ,B同时执行 3}.

10 楼


因该:
  阶段:3 个{1个任务1个阶段}
  状态:2 个{A,B两个机器}
  决策:2 个{由前面两个状态确定}

程序:
  begin
    read(n);
    for i:=1 to n do
      readln(a[i],b[1]);
    af[1].a:=a[1];af[1].b:=0; 
    bf[1].b:=b[1];af[1].a:=0       
    for i:=1 to n do           {动规 开始}
      begin
        af[i].a:=a[i]+fa[i-1].a;            {状态A}
        af[i].b:=b[i]+fa[i-1].b;
        if af[i].a>af[i-1].b then
          begin
            ad.a:=af[i].a;
            ad.am:=af[i-1].b;
          end
        else 
          begin
            ad.a:=af[i-1].b;
            ad.am:=af[i].a; 
          end;
        if af[i].b>af[i-1].a then
          begin
            ad.b:=af[i].b;
            ad.bm:=af[i-1].a;
          end
        else 
          begin
            ad.b:=af[i-1].a;
            ad.bm:=af[i].b;
          end;
        if ad.a=ad.b then
          begin
            if ad.am>=ad.bm then af[i].max:=ad.b;  
            if ad.am<ad.bm then af[i].max:=ad.a; 
          end;
        if ad.a>ad.b then af[i].max:=ad.b
        if ad.a>ad.b then af[i].max:=ad.a



        {略}{将'ad'或'af'改为'ba'或'bf';       {状态B}



      end;
      if af[n].max>bf[n].max then
        max:=bf[n].max
      else
        max:=af[n].max;
      writeln(max);
  end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册