state:
dp[i][j] - whether can bought i garments with j units money
transition:
dp[i][j]=dp[i-1][j+g[i][k]], for 0<=k<t[i] if dp[i-1][j]
which means if we can buy i-1 garments with j units money then we can test all possibilities of garment i
/* UVas */ /*****************************************************************************/ int c, m, C, K; int g[20][20]; int t[20]; int d[20][201]; int main(void) { cin>>c; while (c--) { cin>>m>>C; for (int i=0; i<C; i++) { cin>>t[i]; for (int j=0; j<t[i]; j++) { cin>>g[i][j]; } } memset(d, 0, sizeof(d)); for (int i=0; i<t[0]; i++) { if (m-g[0][i]>=0) { d[0][g[0][i]]=1; } } for (int i=1; i<C; i++) { for (int j=0; j<=m; j++) { if (d[i-1][j]) { for (int k=0; k<t[i]; k++) { d[i][j+g[i][k]]=1; } } } } int f=0; for (int i=m; i>=0; i--) { if (d[C-1][i]) { f=1; cout<<i<<endl; break; } } if (!f) { cout<<"no solution"<<endl; } } return 0; } /*****************************************************************************/
No comments :
Post a Comment