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"); } }