acwing 7 混合背包问题

题面

在这里插入图片描述

题解

对于背包问题,我们知道,每层的更新只和上一层有关系,与背包的类型无关,所以我们只需要逐个遍历,遇到什么类型的背包用什么转移方程更新即可

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 1100;

int n, m;
int f[N];


int main() {
    
    

    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
    
    
        int v, w, s;
        cin >> v >> w >> s;
        if (s == 0) {
    
       //完全背包
            for (int j = v; j <= m; j++) {
    
    
                f[j] = max(f[j], f[j - v] + w);
            }
        } else {
    
    
            if (s == -1) s = 1; //01背包看成使用1次的多重背包

            int k = 1;  //二进制优化多重背包
            while (k <= s) {
    
    
                for (int j = m; j >= k * v; j--) {
    
    
                    f[j] = max(f[j], f[j - k * v] + w * k);
                }
                s -= k;
                k*=2;
            }
            if (s) {
    
    
                for (int j = m; j >= s * v; j--) {
    
    
                    f[j] = max(f[j], f[j - s * v] + w * s);
                }
            }
        }
    }
    cout<<f[m]<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44791484/article/details/115335017