ural 1342 Enterprise

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1342

这道题比赛时理解错了,想成了贪心,结果不断的wa, 其实如果每个车间生产的都是开始时间长以后短的话可以用贪心法做。但没这限制显然是不行的,要用DP。

View Code
 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6
7 double dp1[1001],dp2[1001];
8
9 int main() {
10 int n, m, len,i, s,j,t;
11 while(scanf("%d%d", &n, &m)!=EOF)
12 {
13 len=0;
14 dp1[0] =dp2[0]= 0;
15 for (i = 1; i <= m; i++) {
16 dp1[i]=dp2[i] = -1;
17 }
18 for (t = 0; t < n; t++) {
19 int k, p, q;
20 scanf("%d%d%d", &k, &p, &q);
21
22 for (j = 0; j <= m; j++) { //这里其实和下边可以合并但由于有一个的情况这是会出现除零的情况,所以单独处理了
23 if (dp1[j] != -1 && (dp2[j + 1] == -1 || dp2[j + 1] > dp1[j] + p)) {
24 dp2[j + 1] = dp1[j] + p;
25 }
26 }
27
28 double tmp = p;
29 for (j = 1; j < k; j++) {
30 tmp += p + (q - p) * j * 1. / (k - 1);
31 for (s = 0; s + j + 1 <= m; s++) {
32 if (dp1[s] != -1 && (dp2[s + j + 1] == -1 || dp2[s + j + 1] > dp1[s] + tmp)) {
33 dp2[s + j + 1] = dp1[s] + tmp;
34 }
35 }
36 }
37
38 for (i=0;i<=m;i++)
39 dp1[i]=dp2[i];
40 len += k;
41 }
42 if (len < m) {
43 printf("Maximum possible amount: %d\n", len);
44 }
45 printf("Minimum possible cost: %.2f\n", dp1[len <m ? len : m]);
46 }
47 return 0;
48 }

 

posted @ 2012-03-25 18:29  我们一直在努力  阅读(195)  评论(0编辑  收藏  举报