HDU 3535 AreYouBusy
至少一种 至多一种 还有自由选取的背包问题
参考别人的- -不说了
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n, T, ans, dp1[105], dp2[105]; struct node { int m, tp; int t[105], h[105]; } set[105]; bool cmp(node x,node y) { return x.tp<y.tp; } int main() { int i, j, k; bool vis[105]; while(scanf("%d%d",&n,&T)!=EOF) { for(i=0; i<n; i++) { scanf("%d%d",&set[i].m,&set[i].tp); for(j=0; j<set[i].m; j++) scanf("%d%d",&set[i].t[j],&set[i].h[j]); } sort(set,set+n,cmp); ans=-1; memset(dp1,-63,sizeof(dp1)); dp1[0]=0; for(i=0; i<n; i++) { if(set[i].tp!=0) break; memset(dp2,-63,sizeof(dp2)); for(j=0; j<set[i].m; j++) { for(k=T; k>=set[i].t[j]; k--) { dp2[k]=max(dp2[k],dp2[k-set[i].t[j]]+set[i].h[j]); dp2[k]=max(dp2[k],dp1[k-set[i].t[j]]+set[i].h[j]); } } for(k=0; k<=T; k++) dp1[k]=dp2[k]; } for(; i<n; i++) { if(set[i].tp!=1) break; for(k=T; k>=0; k--) { int maxv=-(0X3F3F3F3F); for(j=0; j<set[i].m; j++) { if(k>=set[i].t[j]) maxv=max(maxv,dp1[k-set[i].t[j]]+set[i].h[j]); } dp1[k]=max(maxv,dp1[k]); } } for(; i<n; i++) { for(j=0; j<set[i].m; j++) { for(k=T; k>=set[i].t[j]; k--) dp1[k]=max(dp1[k],dp1[k-set[i].t[j]]+set[i].h[j]); } } for(i=0; i<=T; i++) ans=max(ans,dp1[i]); printf("%d\n",ans); } return 0; }