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
| #include <bits/stdc++.h> using namespace std; const int maxn = 19; int n, cnt, W, ans, a[maxn], cab[maxn];
void dfs(int i, int cnt) { if (cnt >= ans) return; if (i > n) { ans = min(ans, cnt); return; } for (int j = 1; j <= cnt; ++j) { if (a[i] + cab[j] <= W) { cab[j] += a[i]; dfs(i + 1, cnt); cab[j] -= a[i]; } } cab[cnt + 1] += a[i]; dfs(i + 1, cnt + 1); cab[cnt + 1] -= a[i]; }
int main() { cin >> n >> W; ans = n; for (int i = 1; i <= n; ++i) cin >> a[i]; sort(a + 1, a + 1 + n, [](int &a, int &b) -> bool { return a > b; }); dfs(1, 0); cout << ans; return 0; }
|