以前见过这样类型的dp,就顺手水过了。
这一类就是用f【i】表示a状态为i,b的最小状态。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
int f[2][30085];
int t1[6005],t2[6005],t3[6005];
int n;
int main()
{
scanf("%d",&n);
int maxn=0;
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&t1[i],&t2[i],&t3[i]);
maxn+=max(t1[i],max(t2[i],t3[i]));
}
maxn+=10;
memset(f,inf,sizeof(f));
int now=1,last=0;
f[0][0]=0;
for (int i=1;i<=n;i++)
{
for (int j=0;j<=maxn;j++) f[now][j]=inf;
for (int j=maxn;j>=0;j--)
{
if (t1[i]) f[now][j+t1[i]]=min(f[now][j+t1[i]],f[last][j]);
if (t2[i]) f[now][j]=min(f[now][j],f[last][j]+t2[i]);
if (t3[i]) f[now][j+t3[i]]=min(f[now][j+t3[i]],f[last][j]+t3[i]);
}
swap(now,last);
}
int ans=inf;
for (int i=1;i<=maxn;i++) ans=min(ans,max(i,f[last][i]));
printf("%d",ans);
return 0;
}