Cattle off - loading cargo

Topic Portal

sol: data range is subject to a prompt solution, originally thought when the data range is only $ 20 $ all the time dfs or binary enumeration of this, understand that there is this problem like pressure dp. It does not explain, anyway, is like pressure dp, do much to record it.

  • Like pressure dp
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    pair typedef < int , int > PII;
     const  int INF = 0x3f3f3f3f ;
     const  int MAXN = 22 is ;
     int A [MAXN];
     // DP1 minimum consumption box, a box in the last dp2 premise box minimal consumption of maximum residual 
    int DP1 [ . 1 << MAXN | 10 ], DP2 is [ . 1 << MAXN | 10 ];
     int main () {
         int T; Scanf ( " % D " , & T);
         the while (T-- ) {
             int n-, m, W, _max = 0;
            Scanf ( " % D% D% D " , & n-, & m, & W);
             for ( int I = 0 ; I <n-; I ++) { // shaped pressure dp index or start at 0, and starting from 1 written several times WA 
                Scanf ( " % D " , a & [I]);
                _max = max(_max, a[i]);
            }
            if (_max > w) {
                puts("No");
                continue;
            }
            memset(dp1, INF, sizeof(int) * (1 << n));
            memset(dp2, 0, sizeof(int) * (1 << n));
            dp1[0] = 0;
            for (int i = 0; i < (1 << n); i++) {
                for (int j = 0; j < n; j++) {
                    int k = 1 << j;
                    if (i & k) continue;
                    if (dp2[i] >= a[j] && (dp1[i] < dp1[i | k] || dp1[i] == dp1[i | k] && dp2[i | k] < dp2[i] - a[j])) {
                        DP1 [i | k] = DP1 [i];
                        dp2[i | k] = dp2[i] - a[j];
                    } else if (dp1[i] + 1 <= dp1[i | k]) {
                        DP1 [i | k] = DP1 [i] + 1 ;
                        dp2[i | k] = w - a[j];
                    }
                }
            }
    //        printf("%d\n", dp1[(1 << n) - 1]);
            puts(dp1[(1 << n) - 1] <= m ? "Yes" : "No");
        }
        return 0;
    }

     

  • Burst search
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    typedef pair<int, int> PII;
    int a[30], c[30];
    int n, m, w;
    bool dfs(int i) {
        if (i > n) return true;
        int k = min(i + 1, m); // 这个优化很关键
        for (int j = 1; j <= k; j++) {
            if (c[j] + a[i] <= w) {
                c[j] += a[i];
                if (dfs(i + 1)) return true;
                c[j] -= a[i];
            }
        }
        return false;
    }
    int main() {
        int t; scanf("%d", &t);
        while (t--) {
            scanf("%d%d%d", &n, &m, &w);
            for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
            sort(a + 1, a + 1 + n, greater<int>());
            if (a[1] > w) {
                puts("No");
                continue;
            }
            if (m >= n) {
                puts("Yes");
                continue;
            }
            memset(c, 0, sizeof(c));
            puts(dfs(1) ? "Yes" : "No");
        }
        return 0;
    }

    Data comparison water, in search optimization to burst under extreme circumstances can be AC, wrote that when there is no key optimization is always time-out, was quite wonderful.

Guess you like

Origin www.cnblogs.com/Angel-Demon/p/12188015.html