完全背包优化

f [ i , j ] f[i, j] f[i,j]是用前i个物品,体积为j时的最大价值;
f [ i , j − v ] f[i, j - v] f[i,jv]是用前i个物品,体积为 j − v j - v jv 时的最大价值
因为同一层上面的肯定都是当前最新的最大值,那么就看当前还没确定最大值的这个位置,是加上这个物品好还是不用这个物品好。

//完全背包最优化
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1005;

int n, m;
int f[N];
int v[N], w[N];

int main()
{
    
    
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
    for (int i = 1; i <= n; i ++ )
    {
    
    
        for (int j = v[i]; j <= m; j ++ )
        {
    
    
            f[j] = max(f[j], f[j - v[i]] + w[i]);
        }
    }
    cout << f[m] << endl;
    return 0;
}

//01背包
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;

int n, m;
int v[N], w[N];
int f[N];

int main()
{
    
    
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
    for (int i = 1; i <= n; i ++ )
    {
    
    
        for (int j = m; j >= v[i]; j -- )
        {
    
    
            f[j] = max(f[j], f[j - v[i]] + w[i]);
        }
    }
    cout << f[m] << endl;
    return 0;
}

完全背包和01背包的优化,一个体积要正着写,一个要倒着写,就是因为它们都是要由前面的值来算出当前的体积,但是01背包每种物品只有一个,所以要用没有更新过的体积来比较最大值,但是完全背包每种物品有无数件,所以要用已更新过的来算出再加上一个当前物品v是否是最大值。
01是看放这件好还是不放这件好,完全背包是看放几件这个物品好。

猜你喜欢

转载自blog.csdn.net/qq_34682765/article/details/121892418