不需要任何剪枝的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; }