DP问题 -- "装箱问题"的二维解法和一维解法
查看原帖
DP问题 -- "装箱问题"的二维解法和一维解法
1603098
J_Grigg楼主2024/12/2 14:22
二维 :
#include <iostream>

using namespace std;

const int N = 35, M = 2e5 + 10;

int f[N][M]; // f[i][j] : 从前i个物品中选,箱子体积为j的情况下能装的最大体积
int w[N];

int main()
{
    int V, n;
    cin >> V >> n;
    for (int i = 1 ; i <= n ; i ++) cin >> w[i];

    for (int i = 1 ; i <= n ; i ++) // 所有物品(选或不选)
        for (int j = 0 ; j <= V ; j ++)
        {
            f[i][j] = f[i-1][j];
            if (j >= w[i]) f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + w[i]); // 选
        }

    cout << V - f[n][V] << endl;

    return 0;
}

优化成一维 :
#include <iostream>

using namespace std;

const int M = 20010;

int f[M];
int n, V;

int main()
{
    cin >> V >> n;

    for(int i = 1 ; i <= n ; i ++)
    {
        int v;
        cin >> v;
        for(int j = V ; j >= v ; j --) f[j] = max(f[j], f[j - v] + v);
    }

    cout << V - f[V] << endl;

    return 0;
}
2024/12/2 14:22
加载中...