求助 关于贪心的部分
查看原帖
求助 关于贪心的部分
757864
ruye楼主2024/11/27 16:48
#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]要是最后一个电梯的剩余体积 不应该是所有电梯的最大剩余体积吗

2024/11/27 16:48
加载中...