HDU3535-AreYouBusy
http://acm.hdu.edu.cn/showproblem.php?pid=3535
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[110][110],c[110],g[110],n,T,i,j,k,m,s; void case0() { for(j=0;j<=T;j++) dp[i][j]=-1000000; for(j=1;j<=m;j++) for(k=T;k>=c[j];k--) { dp[i][k]=max(dp[i][k],dp[i][k-c[j]]+g[j]); dp[i][k]=max(dp[i][k],dp[i-1][k-c[j]]+g[j]); } } void case1() { for(j=0;j<=T;j++) dp[i][j]=dp[i-1][j]; for(j=1;j<=m;j++) for(k=T;k>=c[j];k--) dp[i][k]=max(dp[i][k],dp[i-1][k-c[j]]+g[j]); } void case2() { for(j=0;j<=T;j++) dp[i][j]=dp[i-1][j]; for(j=1;j<=m;j++) for(k=T;k>=c[j];k--) { dp[i][k]=max(dp[i][k],dp[i][k-c[j]]+g[j]); dp[i][k]=max(dp[i][k],dp[i-1][k-c[j]]+g[j]); } } int main(void) { while(scanf("%d%d",&n,&T)!=EOF) { memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d%d",&m,&s); for(j=1;j<=m;j++) scanf("%d%d",&c[j],&g[j]); if(s==0) case0(); else if(s==1) case1(); else case2(); } printf("%d\n",max(dp[n][T],-1)); } return 0; }