题目链接。
分析:
这题就是01背包。dp数组开不到 10000000,表示木办法,然后就用了dfs,TLE,剪了几下还是TLE。
跟人学了下其它剪枝,过了。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 35 #define INF 10000010 int w[MAXN]; int n, m, min; int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b > 0 ? -1 : 1; } void dfs(int cur, int remain){ int i, s; if(min == 0) return ;//剪枝 if(cur >= n){ if(remain < min) min = remain; return ; } s = remain; for(i=cur; i<n; i++){//剪枝,这个剪枝是关键 s -=w[i]; } if(s > min) return; if(remain >= w[cur]) dfs(cur+1, remain - w[cur]); dfs(cur+1, remain); } int main(){ int i; while(scanf("%d %d", &n, &m) == 2){ min = INF; for(i=0; i<n; i++) scanf("%d", &w[i]); qsort(w, n, sizeof(w[0]), cmp); dfs(0, m); printf("%d\n", m-min); } return 0; }