zoukankan      html  css  js  c++  java
  • AcWing

    https://www.acwing.com/problem/content/167/

    18只猫,每只猫有重量,车有载重上限,求最小的数量的车把猫装完,保证有解。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int INF = 0x3f3f3f3f;
    //dp[i][j]表示用了i只猫,j辆缆车,最后一辆缆车的最大空间
    int dp[1 << 18][19];
    int a[18];
    
    int main() {
    #ifdef Yinku
        freopen("Yinku.in", "r", stdin);
    #endif // Yinku
        int n, w;
        scanf("%d%d", &n, &w);
        for(int i = 0; i < n; ++i)
            scanf("%d", &a[i]);
        memset(dp, -INF, sizeof(dp));
        for(int k = 1; k <= n; ++k) {
            dp[0][k] = w;
        }
        for(int i = 0; i < (1 << n); ++i) {
            for(int j = 0; j < n; ++j) {
                if((i & (1 << j)) == 0) {
                    for(int k = 0; k <= n; ++k) {
                        if(dp[i][k] >= a[j]) {
                            dp[i | (1 << j)][k] = max(dp[i | (1 << j)][k], dp[i][k] - a[j]);
                        }
                        if(dp[i][k] >= 0 && k + 1 <= n)
                            dp[i | (1 << j)][k + 1] = max(dp[i | (1 << j)][k + 1], w - a[j]);
                    }
                }
            }
            /*for(int k = 0; k <= n; ++k) {
                printf("dp[");
                cout << bitset<5>(i);
                printf("][%d]=%d
    ", k, dp[i][k]);
            }
            puts("");*/
        }
    
        for(int k = 0; k <= n; ++k) {
            if(dp[(1 << n) - 1][k] >= 0) {
                printf("%d
    ", k);
                return 0;
            }
        }
    }
    

    但如果从搜索的角度来看的话,是建一个数组表示车,然后从最大的猫开始枚举它在哪辆车里。

  • 相关阅读:
    POJ--2356 Find a multiple
    Trailing Zeroes (III)
    第一章 快速入门
    第二章 变量和基本类型
    第三章 标准库类型
    第四章 数组和指针
    第五章 表达式
    第六章 语句
    第七章 函数
    第八章 标准IO库
  • 原文地址:https://www.cnblogs.com/Inko/p/11631110.html
Copyright © 2011-2022 走看看