题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

分组背包问题

主件与附近有4种组合:

  1. 只有主件
  2. 主件+附件1
  3. 主件+附件2
  4. 主件+附件1+附件2

这4种组合构成一组,只能从这一组中选择一种组合!因此就将该问题转换为分组背包问题。

代码

#include<iostream>
#include<math.h>
#include<bits/stdc++.h>

using namespace std;

int f[32000];

int main(){
    int n, m;
    cin >> n >> m;
    vector<int> v(m+1);
    vector<int> w(m+1);
    vector<int> q(m+1);

    unordered_map<int, vector<int>> mp;
    for(int i = 1; i <= m; i ++){
        cin >> v[i] >> w[i] >> q[i];
        w[i] = v[i]*w[i];
        if(q[i]){
            mp[q[i]].push_back(i);
        }
    }   
    vector<vector<int>> V;
    vector<vector<int>> W;
    for(int i = 1; i <= m; i ++){
        vector<int> v_tmp;
        vector<int> w_tmp;
        if(mp.count(i)){
            v_tmp.push_back(v[i]);
            w_tmp.push_back(w[i]);
            if(mp[i].size() == 1){
                v_tmp.push_back(v[i] + v[mp[i][0]]);
                w_tmp.push_back(w[i] + w[mp[i][0]]);
            }
            if(mp[i].size() == 2){
                v_tmp.push_back(v[i] + v[mp[i][0]]);
                w_tmp.push_back(w[i] + w[mp[i][0]]);

                v_tmp.push_back(v[i] + v[mp[i][1]]);
                w_tmp.push_back(w[i] + w[mp[i][1]]);

                v_tmp.push_back(v[i] + v[mp[i][0]] + v[mp[i][1]]);
                w_tmp.push_back(w[i] + w[mp[i][0]] + w[mp[i][1]]);
            }
        }else if(q[i] == 0){
            v_tmp.push_back(v[i]);
            w_tmp.push_back(w[i]);
        }
        V.push_back(v_tmp);
        W.push_back(w_tmp);
    }
    for(int i = 1; i <= m; i++){
        for(int j = n; j >=0; j --){
            for(int k = 0; k < V[i-1].size(); k++){
                if(j >= V[i-1][k]){
                    f[j] = max(f[j], f[j-V[i-1][k]] + W[i-1][k]);
                }
            }
        }
    }

    cout << f[n];

    return 0;

}

分组背包问题描述

有 N 组物品和一个容量是 V 的背包。
每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 v[i][j],价值是 w[i][j],其中 i 是组号,j 是组内编号。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

全部评论

相关推荐

11-02 08:15
已编辑
门头沟学院 Java
美团 Java后端开发 10w刀 美硕
YamadaAnna:包留美的,你拿的美团 招银,没一个不加班的。考虑一下未来吧,应届生的工资真不重要,10w刀税后6w,省省还是能活下去的。回国了35岁怎么办,难道35岁还能返美么,就算35岁还能在国内找到工作,难道打算一辈子9点10点下班么。你有能力在美利坚找到工作,回国如果不是哪个965大厂给你发个ssp,真不值得。 等抽不中h1b,没办法了再回国吧。
点赞 评论 收藏
分享
给我一个offer吧求求啦:轮到大佬给公司发感谢信了,想想就爽
点赞 评论 收藏
分享
09-29 11:19
门头沟学院 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务