ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20191111luogu2224加工调度 | 背包DP

2019-11-11 17:00:20  阅读:237  来源: 互联网

标签:背包 加工 int t2 t3 t1 物品 20191111luogu2224 DP


luogu2224加工调度

同时推荐luogu里的第一篇题解

题意:

n个物品,可以在A机器上加工花费t1,可以在B机器上加工花费t2,或者A、B同时加工花费t3,

A、B同时加工物品,求加工所有的物品的最短用时

神奇的dp:

因为用背包转移状态,转移后背包是填满的状态 ,

所以我们不用排序考虑物品选择那种方式加工 ,不用担心同时加工会不会耽误空档时间,不用考虑谁先谁后的问题, 背包的优势在这道题上体现了出来

f[i][j]表示加工前i个物品A机器加工总时间为j时B的最小时间

转移方程:

f[i][j] = min(f[i][j],f[i-1][j-a[i].t1])

f[i][j]  = min(f[i][j],f[i-1][j]+a[i].t2)

f[i][j] = min(f[i][j],f[i-1][j-a[i].t3]+a[i].t3)

细节:

范围为n《=6000,t 《=5,所以直接开二维数组会MLE,要用滚动数组压掉一维

在写的时候要先判断第二个状态,再判断剩余两个状态,便于转移

这样我们又会发现TLE了,考虑优化,由于t《=5,所以前i个物品最大时间就是5*i,于是j从5*i倒叙枚举,就可以解决TLE的问题

时间复杂度:O(小于n*n*5)

好题!!!

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 #define minn(x,y) x<y?x:y
 6 #define maxn(x,y) x>y?x:y
 7 #define re register
 8 struct node
 9 {
10     int t1,t2,t3;
11 }a[6005];
12 int f[30005];
13 inline int read()
14 {
15     int res = 0,f = 1;
16     char c;
17     c = getchar();
18     while(c < '0' || c > '9')
19     {
20         if(c == '-')f = -1;
21         c = getchar();
22     }
23     while(c >= '0' && c <= '9')
24     {
25         res = res * 10 + c - '0';
26         c = getchar();
27     }
28     return res * f;
29 }
30 int main()
31 {
32     int n,sum = 0;
33     n = read();
34     for(re int i = 1;i <= n;i ++)
35     {
36         a[i].t1 = read();
37         a[i].t2 = read();
38         a[i].t3 = read();
39         sum = sum + max(a[i].t1,a[i].t3);
40         
41     }
42     for(re int i = 1;i <= sum;i ++)f[i] = 1e9;
43     for(re int i = 1;i <= n;i ++)
44     {
45         for(re int j = 5 * i;j >= 0;j --)
46         {
47             if(a[i].t2)f[j] = f[j] + a[i].t2;
48             else f[j] = 1e9;
49             if(a[i].t3 && j >= a[i].t3)f[j] = minn(f[j],f[j - a[i].t3] + a[i].t3);
50             if(a[i].t1 && j >= a[i].t1)f[j] = minn(f[j],f[j - a[i].t1]);
51         }
52     }
53     int ans = 1e9;
54     for(re int i = 0;i <= sum;i ++)
55     {
56         ans = min(ans,maxn(i,f[i]));
57     }
58     printf("%d",ans);
59     return 0;
60 } 

 

标签:背包,加工,int,t2,t3,t1,物品,20191111luogu2224,DP
来源: https://www.cnblogs.com/djfuuxjz/p/11836616.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有