• P1049 装箱问题


    P1049 装箱问题

    背包问题的简化版本.

    类似的还有

    P2639 [USACO09OCT]Bessie's Weight Problem G

    P2925 [USACO08DEC]Hay For Sale S

    所谓剩余空间最小,即在有限的空间里放最多的物品.

    如果把物体的体积看作w[i],且物体的体积也看作v[i],你会发现这是01背包问题,只不过w[i]和v[i]相等,W即箱子的体积.

    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    
    int W, n, s[510];
    int dp[45010];
    
    int main() {
        cin >> W >> n;
        for (int i = 0; i < n; i++) cin >> s[i];
    
        for (int i = 0; i < n; i++)
            for (int j = W; j >= s[i]; j--)
                dp[j] = max(dp[j], dp[j - s[i]] + s[i]);
    
        cout << W - dp[W] << endl;
        
        return 0;
    }

    (以上代码不保证AC)

    先前的AC代码:

    #include <algorithm>
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    
    int n, V, dp[50][20000];
    int s[50];
    
    int rec(int i, int v)
    {
        if(dp[i][v] >= 0) return dp[i][v]; 
        int res;
        if(i == n) res = v;
        else if(s[i] > v) res = rec(i + 1, v);
        else res = min(rec(i + 1, v - s[i]), rec(i + 1, v));
    
        return dp[i][v] = res;
    }
    
    int main()
    {
        cin >> V >> n;
        memset(dp, -1, sizeof(dp));
        for(int i = 0; i < n; i++) cin >> s[i];
        
        printf("%d
    ", rec(0, V));
    
        return 0;
    }
  • 相关阅读:
    P1522 牛的旅行
    P1908 逆序对
    P1107 雷涛的小猫
    欧拉函数
    P2679 子串
    P1063 能量项链
    P1052 过河
    P1020 导弹拦截
    P1330 阳光封锁大学
    P1198 最大数
  • 原文地址:https://www.cnblogs.com/Gaomez/p/14100691.html
Copyright © 2020-2023  润新知