ZOJ 3554 A Miser Boss

dp。

dp[i][j][k] :i表示前i个工件,j表示在A工作台上的耗时-B工作台上的耗时,k表示在A工作台上的耗时-C工作台上的耗时。

dp[i][j+a[i]][k+a[i]]=min(dp[i-1][j][k]+a[i],dp[i][j+a[i]][k+a[i]]);
dp[i][j-b[i]][k]=min(dp[i-1][j][k]+b[i],dp[i][j-b[i]][k]);
dp[i][j][k-c[i]]=min(dp[i-1][j][k]+c[i],dp[i][j][k-c[i]]);
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;

const int INF=0x3f3f3f3f;

int dp[45][250][250];
int a[45],b[45],c[45];
int n;

int main()
{
    while(scanf("%d",&n)==1) {
        memset(dp,0x3f,sizeof dp);
        dp[0][120][120]=0;
        for(int i=1;i<=n;++i)
            scanf("%d%d%d",a+i,b+i,c+i);
        for(int i=1;i<=n;++i) {
            for(int j=0;j<=240;++j) {
                for(int k=0;k<=240;++k) {
                    if(dp[i-1][j][k]!=INF) {
                        dp[i][j+a[i]][k+a[i]]=min(dp[i-1][j][k]+a[i],dp[i][j+a[i]][k+a[i]]);
                        dp[i][j-b[i]][k]=min(dp[i-1][j][k]+b[i],dp[i][j-b[i]][k]);
                        dp[i][j][k-c[i]]=min(dp[i-1][j][k]+c[i],dp[i][j][k-c[i]]);
                    }
                }
            }
        }
        if(dp[n][120][120]!=INF)
            printf("%d\n",dp[n][120][120]/3);
        else puts("NO");
    }
}

 

posted @ 2014-03-26 00:24  MoriMiya  Views(167)  Comments(0Edit  收藏  举报