AcWing 4877. 最大价值

4877. 最大价值

有一个容量为 n的背包和 m+1种物品,每种物品都有无限多个。

物品种类编号为 0∼m

第 i 种物品的体积为 vi,价值为 wi

在使用背包装入物品时,每种物品的限重如下:

  • 第 00 种物品:重量忽略不计,在装入时没有重量限制。

  • 第 1∼m种物品:第 i种物品的单个重量为 hi,如果该种物品的装入总重量超过 li,则视为超重。

现在,请你挑选物品装入背包,要求

  • 所有装入物品的总体积不得超过背包容量。

  • 所有存在重量限制的物品均不得超重。

  • 满足以上所有条件的前提下,所有装入物品的总价值尽可能大。

输出总价值的最大可能值。

注意审题,不要将 n,m的含义弄混。

输入格式

第一行包含四个整数 n, m, v0, w0

接下来 m行,每行包含四个整数 li,hi,vi,wi

输出格式

一个整数,表示总价值的最大可能值。

数据范围

4 个测试点满足 1≤n≤1001≤m≤2

所有测试点满足 1≤n≤10001≤m≤101≤li,hi,vi,wi≤100

输入样例1:

10 2 2 1
7 3 2 100
12 3 1 10

输出样例1:

241

输入样例2:

100 1 25 50
15 5 20 10

输出样例2:

200

和多重背包特别像,s就是l / h;n++就行了acwing5

#include 
#pragma GCC optimize (2)
using namespace std;
const int INF = 1e9;
const int N = 2110;
int n, m;
int v[N], w[N], s[N];
int f[N][N];
int main()
{
    cin >> m >> n;
    cin >> v[1] >> w[1];
    s[1] = INF;
    //n++;
    for(int i = 2; i <= n + 1; i++) {
        int l, h;
        cin >> l >> h >> v[i] >> w[i];
        s[i] = l / h;
    }
        
    for(int i = 1; i <= n + 1; i++)
    {
        for(int j = 0; j <= m; j++)
        {
            for(int k = 0; k <= s[i] && k * v[i] <= j; k++)
                f[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);
        }
    }
    cout << f[n + 1][m] << endl;
    return 0;
}

你可能感兴趣的:(AcWing算法提高课题解,算法,C++,算法,C++)