任务安排
題目描述
N個任務排成一個序列在一臺機器上等待完成(順序不得改變),這N個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是Ti。在每批任務開始前,機器需要啟動時間S,而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。每個任務的費用是它的完成時刻乘以一個費用系數Fi。請確定一個分組方案,使得總費用最小。
例如:S=1;T={1,3,4,2,1};F={3,2,3,3,4}。如果分組方案是{1,2}、{3}、{4,5},則完成時間分別為{5,5,10,14,14},費用C={15,10,30,42,56},總費用就是153。
輸入輸出格式
輸入格式:
第一行是N(1<=N<=5000)。
第二行是S(0<=S<=50)。
下面N行每行有一對數,分別為Ti和Fi,均為不大于100的正整數,表示第i個任務單獨完成所需的時間是Ti及其費用系數Fi。
輸出格式:
一個數,最小的總費用。
輸入輸出樣例
輸入樣例#1:
5
1
1 3
3 2
4 3
2 3
1 4
輸出樣例#1:
153
.
.
.
.
.
.
分析
這道題采用動態規劃的思想,用f[i]表示完成前i個任務所需的最小費用,用tim[i]表示前i項任務所需的時間,用mon[i]表示前i項任務一共的費用系數。動歸式如下:
f[i]=min{f[j-1]+s*(mon[n]-mon[j-1])+
tim[i]*(mon[i]-mon[j-1])|1<=j<=i};
如果在完成第j項任務是啟動一次機器,后面的所有任務完成的時刻都要加上s,所以每啟動一次機器的費用為s*(mon[n]-mon[j-1]);
如果把第j項任務和第i項任務和在一起做,則它們的完成時刻為tim[i],所以費用為tim[i]*(mon[i]-mon[j-1])。
.
.
.
.
.
.
程序:
#include<iostream> #include<cstdlib> #include<cstdio> using namespace std; int f[5001],g[5001]; int len,wei,n,tim[5001],mon[5001],ti[5001],s; int main () {scanf("%d%d",&n,&s);for (int b=1;b<=n;++b){scanf("%d%d",&tim[b],&mon[b]);tim[b]+=tim[b-1];mon[b]+=mon[b-1];f[b]=2147483647;}for (int i=1;i<=n;++i)for (int j=1;j<=i;++j)f[i]=min(f[i],f[j-1]+s*(mon[n]-mon[j-1])+tim[i]*(mon[i]-mon[j-1]));printf("%d",f[n]);return 0; }轉載于:https://www.cnblogs.com/YYC-0304/p/9499970.html
總結
- 上一篇: “非常男女”计划
- 下一篇: Out of Hay