POJ 3628 Bookshelf 2
对于每头牛可以取或者不取,因此两种方法:dfs或二进制枚举,不过二进制枚举比较慢,但一般来说都能在题目限定时间内出解。
1.DFS(32ms):
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #define INF 0x7fffffff using namespace std; int vis[22], H[22], ans, B, N; void dfs(int dep, int tmp){ if(tmp - B > ans) return; if(dep == N){ if(tmp >= B) ans = min(ans, tmp-B); return; } dfs(dep+1, tmp); dfs(dep+1, tmp+H[dep]); } int main(){ /* freopen("in.c", "r", stdin); */ while(~scanf("%d%d", &N, &B)){ for(int i = 0;i < N;i ++) scanf("%d", H+i); ans = INF; dfs(0, 0); printf("%d\n", ans); } return 0; }
2.二进制枚举:
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #define INF 0x7fffffff using namespace std; int H[22], ans, B, N; int main(){ /* freopen("in.c", "r", stdin); */ while(~scanf("%d%d", &N, &B)){ for(int i = 0;i < N;i ++) scanf("%d", H+i); ans = INF; int UP = (1 << N); for(int i = 1;i < UP;i ++){ int sum = 0; for(int j = 0;j < N;j ++) if(i & (1 << j)) sum += H[j]; if(sum >= B && sum-B < ans) ans = sum-B; } printf("%d\n", ans); } return 0; }