下标是代表机器 值代表一个机器 好思路
/************************************************************** Problem: 1222 User: lxy8584099 Language: C++ Result: Accepted Time:9440 ms Memory:1056 kb ****************************************************************/ /* 共同完成不是同时完成吧。。。 tb= f[i,ta]表示前i个产品 A用时ta的时候 B用时tb的最小值 f[i,ta]= min f[i-1,ta-ca],f[i-1,ta]+cb,f[i-1,ta-cc]+cc 滚动数组滚一下 */ #include<cstdio> #include<cstring> #define inf (0x3fffffff) using namespace std; const int N=6050*5; int f[2][N],n,k,mn=inf; int max(int a,int b){return a>b?a:b;} void getmin(int&a,int b) {if(a>b) a=b;} int main() { scanf("%d",&n); memset(f,0x3f,sizeof(f)); f[0][0]=0; for(int i=1,ca,cb,cc;i<=n;i++) { scanf("%d%d%d",&ca,&cb,&cc); for(int j=0;j<=n*5;j++) { if(cb) f[k^1][j]=f[k][j]+cb; else f[k^1][j]=inf; if(j>=ca&&ca) getmin(f[k^1][j],f[k][j-ca]); if(j>=cc&&cc) getmin(f[k^1][j],f[k][j-cc]+cc); if(i==n) getmin(mn,max(f[k^1][j],j)); } k^=1; } printf("%d\n",mn); return 0; }