题解:
状态:f[i][j] 前i个题目a一共做了j分钟 b最少的做题时间
转移:考虑每个题目给谁做 f[i][j] = min ( f[i-1][j-a] a做 , f[i-1][j]+b b做);
同时更新答案
AC代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 201 #define da 40000 int n,sum,f[N][N*N]; int main(){ memset(f,127/3,sizeof f); f[0][0]=0;int a,b,ans=0x7fffffff; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&a,&b);sum+=b; f[i][0]=sum; for(int j=0;j<=da;j++){ if(j>=a) f[i][j]=min(f[i-1][j-a],f[i-1][j]+b); else f[i][j]=f[i-1][j]+b; if(i==n) ans=min(ans,max(f[n][j],j)); } } printf("%d ",ans); return 0; }