主题:[讨论]动态规划题<我想了好多天了><高手进,初学者就别浪费时间了>
waglongjuanfeng
[专家分:90] 发布于 2007-06-14 17:36:00
有两台机器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个回复)
沙发
worm. [专家分:180] 发布于 2007-06-15 16:13:00
大概是:
~~~~~~~~~~~~~~
找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 楼
PHI [专家分:10] 发布于 2007-08-28 10:37:00
真的,用不着规划。(如果任务没有顺序)
伪代码:
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 楼
hzp9084 [专家分:0] 发布于 2007-09-18 23:26:00
f(i):=min{f(i-1)+a[i],f(i-1)+b[i]}
f(
i)为前i个任务最少时间
5 楼
jialiang2509 [专家分:30] 发布于 2007-09-23 14:19:00
独立任务最优调度问题
#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 楼
vcacm [专家分:1500] 发布于 2007-09-23 20:10:00
晕呀,,,
LS的这么长。。。
[code]
for(i= 1; i<= n ; i++)
{
if ( ta + a[i] < tb + b[i] )
ta += a[i] ;
else
tb += b[i] ;
}
[/code]
7 楼
vcacm [专家分:1500] 发布于 2007-09-23 20:12:00
[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 楼
liulibo133 [专家分:170] 发布于 2007-09-25 03:57:00
贪心的~~~不用动规
9 楼
qxz_qqq [专家分:30] 发布于 2007-11-11 19:52:00
我跟一楼的看法不一样,
如果测试数据是:
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 楼
qxz_qqq [专家分:30] 发布于 2007-11-11 20:56:00
因该:
阶段: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.
我来回复