1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <cstdio> #include <algorithm> using namespace std;
const int MAXN = 20;
int n, w, cats[MAXN], f[MAXN], ans; bool book[MAXN];
void dfs(int ind = 1 , int sum = 0 ) { if(sum > ans) return; if(ind == n + 1) { if(sum < ans) ans = sum; return; } for(int i = 1; i <= sum; i ++) { if(cats[ind] + f[i] <= w) { f[i] += cats[ind]; dfs(ind + 1, sum); f[i] -= cats[ind]; } } f[sum + 1] = cats[ind]; dfs(ind + 1, sum + 1); f[sum + 1] = 0; }
bool cmp(int x, int y) { return x > y; }
int main() { scanf("%d %d ", &n, &w); for(int i = 1; i <= n ; i ++) { scanf("%d", &cats[i]); } ans = n; sort(cats + 1, cats + 1 + n, cmp); dfs(); printf("%d", ans); return 0; }
|