#include <bits/stdc++.h>
using namespace std;
const int N = 2e1 + 10, M = (1 << 18) + 10;
int n, w;
int a[N];
int dp[M]; // dp[i]状态为i的最小次数
int g[M]; // g[i]状态为i时,最后一个电梯的剩余体积
int main() {
cin >> n >> w;
for (int i = 0; i < n; i ++ ) cin >> a[i];
memset(dp, 0x3f, sizeof dp);
dp[0] = 1;
g[0] = w;
for (int i = 0; i < (1 << n); i ++ ) {
for (int j = 0; j < n; j ++ ) {
if ((i & (1 << j)) == 0) continue ;
int k = i ^ (1 << j);
if(g[k] >= a[j] && dp[i] >= dp[k]) {
if(dp[i] > dp[k]) {
dp[i] = dp[k];
g[i] = g[k] - a[j];
}
else g[i] = max(g[i], g[k] - a[j]);
}
else if(g[k] < a[j] && dp[i] >= dp[k] + 1){
if(dp[i] > dp[k] + 1) {
dp[i] = dp[k] + 1;
g[i] = w - a[j];
}
else {
g[i] = max(g[i], w - a[j]);
}
}
}
}
cout << dp[(1 << n) - 1] << endl;
return 0;
}
为什么g[i]要是最后一个电梯的剩余体积 不应该是所有电梯的最大剩余体积吗