bzoj1222

奇怪的dp

思路清奇 dp[i][j]表示当前做完了i个任务,1机器花了j秒,2机器花费的最少时间,然后转移就行了。

#include<bits/stdc++.h>
using namespace std;
const int N = 6005;
struct data {
    int a, b, c;
} a[N];
int n, ans = 0x3f3f3f3f, pre;
int dp[2][N * 5];
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) 
    {
        scanf("%d%d%d", &a[i].a, &a[i].b, &a[i].c);
        if(a[i].a == 0) a[i].a = 0x3f3f3f3f;
        if(a[i].b == 0) a[i].b = 0x3f3f3f3f;
        if(a[i].c == 0) a[i].c = 0x3f3f3f3f; 
    }
    for(int i = 1; i <= n; ++i)
    {
        pre ^= 1;
        memset(dp[pre], 0x3f3f, sizeof(dp[pre]));
        for(int j = 0; j <= 30000; ++j)
        {
            if(j >= a[i].a) dp[pre][j] = dp[pre ^ 1][j - a[i].a];
            dp[pre][j] = min(dp[pre][j], dp[pre ^ 1][j] + a[i].b);
            if(j >= a[i].c) dp[pre][j] = min(dp[pre][j], dp[pre ^ 1][j - a[i].c] + a[i].c);
        }
    }
    for(int i = 0; i <= 30000; ++i) ans = min(ans, max(i, dp[pre][i]));
    cout << ans;
    return 0;
}
View Code

 

posted @ 2017-10-27 20:44  19992147  阅读(135)  评论(0编辑  收藏  举报