不需要任何剪枝的DFS
/*
* hdu-2066
* mike-w
* 2012-9-30
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 25
#define reset(x) memset(x, 0, sizeof(x))
int v[MAXN], w[MAXN];
int tag[MAXN];
int N, K, W, C;
int ans;
int search(int cnt, int id, int vv, int ww)
{
if(cnt==K+1)
ans=ans>vv?ans:vv;
else
{
int i;
for(i=id; i<N; i++)
if(ww+w[i]<=W)
search(cnt+1, i+1, vv+v[i], ww+w[i]);
}
return 0;
}
int main(void)
{
int i;
scanf("%d", &C);
while(C-->0)
{
reset(v);
reset(w);
reset(tag);
ans=0;
scanf("%d%d", &N, &K);
for(i=0; i<N; i++)
scanf("%d%d", v+i, w+i);
scanf("%d", &W);
search(1,0,0,0);
printf("%d\n", ans);
}
return 0;
}