/* 这题应该不难,主要是将种族杀掉不同怪物 数分别做成一个背包,另外是记录杀死n个怪物 * 所需要的能量,但是为什么就ac不了呢。。 */ #include<memory.h> #include<stdio.h> #include<algorithm> using namespace std; int m,n,p; //e[i][j] 用于记录第i个种族杀掉j个怪物所需要的最少能量 //用d[i][j]记录前i个种族要杀掉j个怪物需要最少能量 int s[610],e[610][610],r[610]; int d[610][610]; int dp() { int _max; memset(d,0x7f,sizeof(d)); d[0][0] = 0; _max = 0; //dp过程 for(int i = 1; i <= m; i++){ for(int j = 0; j <= _max; j++) for(int k = 0; k <= r[i]; k++) if(d[i-1][j] + e[i][k] < d[i][j+k]) d[i][j+k] = d[i-1][j] + e[i][k]; _max += r[i]; } for(int i = n; i >= 0; i--) if(d[m][i] <= p) return i; return 0; } bool init() { int eng,race; memset(r,0,sizeof(r)); memset(e,0,sizeof(e)); if(scanf("%d%d%d",&n,&m,&p)==EOF) return false; for(int i = 1; i <= m; i++) scanf("%d",&s[i]); for(int i = 0; i < n; i++){ scanf("%d%d",&eng,&race); r[race]++; e[race][r[race]] = eng; } int *xx; for(int i = 1; i <= m; i++){ if(!r[i]) continue; xx = e[i]; sort(xx+1,xx+r[i]+1); e[i][0] = 0; e[i][1] += s[i]; for(int j = 2; j <= r[i]; j++) e[i][j] += e[i][j-1]; } } int main() { while(init()) printf("%d/n",dp()); return 0; }