首页 > 其他分享 >P1858 多人背包

P1858 多人背包

时间:2022-12-29 11:37:05浏览次数:37  
标签:背包 int 55 ++ P1858 多人 物品

P1858 多人背包

题意:

一共有 \(K\) 个人,每个人的背包容量相同都为 \(V\) ,一共有 \(N\) 种物品,每个人每种物品都最多选一个。要求每个人的选的物品总体积必须等于背包的体积。并且要求这 \(K\) 个的 选法都不相同,求在满足上面要求的前提下,包里物品的总价值是多少?

思路:

要求总和最大,其实就是求,凑成的方案的前 \(K\) 大价值的话,所以就想到了求第 \(K\) 最优解问题。但是主要到该题要求背包容量刚好装满,所以转移的时候,一定要判断前一个状态存在再进行转移。

然后考虑如果保证选出来的 \(K\) 大价值的方案都不同。其实我们分析一下我们转移时的状态。从不选当前物品的前 \(k\) 大不同的方案,选当前物品的前 \(k\) 大不同方案转移过来。从状态上看就知道,这样得到的 $2 \times k $ 个方案肯定是互不相同的,所以直接转移就可以了。

值得注意的是,这里的初始化值,其实是 \(f[0][1] = 0\) 因为没有物品时的第一大值为 0。

实现:

#include <bits/stdc++.h>
using namespace std;
const int N = 205, M = 5005;
int w[N], v[N];
int f[M][55];

int main()
{
    int k, m, n;
    scanf("%d%d%d", &k, &m, &n);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &w[i], &v[i]);

    //初始化
    for (int i = 0; i < M; i++)
        for (int j = 0; j < 55; j++)
            f[i][j] = -1;
    f[0][1] = 0;

    for (int i = 1; i <= n; i++)
    {
        for (int j = m; j >= w[i]; j--)
        {
            int a[55] = {0}, b[55] = {0};
            for (int i = 1; i < 55; i++)
                a[i] = b[i] = -1;
            for (int l = 1; l <= k; l++)
            {
                a[l] = f[j][l];
                // 因为要保证体积刚好为 m
                if (f[j - w[i]][l] != -1)
                    b[l] = f[j - w[i]][l] + v[i];
            }
            a[k + 1] = b[k + 1] = -1;
            int ai = 1, bi = 1;
            for (int l = 1; l <= k && (a[ai] != -1 || b[bi] != -1); l++)
            {
                if (a[ai] > b[bi])
                    f[j][l] = a[ai++];
                else
                    f[j][l] = b[bi++];
            }
        }
    }

    int flag = 1, res = 0;
    for (int i = 1; i <= k; i++)
    {
        res += f[m][i];
        if (f[m][i] == -1)
            flag = 0;
    }
    if (!flag)
        res = 0;

    printf("%d\n", res);

    return 0;
}

标签:背包,int,55,++,P1858,多人,物品
From: https://www.cnblogs.com/zxr000/p/17012025.html

相关文章

  • 动态规划-背包问题
    01背包问题问题描述:有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是vi,价值是wi,求解将哪些物品装入背包,可使这些物品的总体积不超过......
  • 01背包问题中滚动数组的理解
     时间:2022/12/28 问题:背包的最大重量为4。每个物品只有一个,物品重量及价值如下所示: 重量价值物品0115物品1320物品2430问背包能背的物......
  • 多重背包.
    题目描述给有一个能承重V的背包,和n种物品,每种物品的数量有限多,我们用重量、价值和数量的三元组来表示一个物品,第i件物品表示为(Vi,Wi,Si),问在背包不超重的情况下,得到物品的......
  • 代码随想录 - 背包问题
    vector<int>weight={1,3,4};vector<int>value={15,20,30};intbagWeight=4;//01背包如果先遍历背包后遍历物品那就是每个包只会装一......
  • 后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)
    新冠病毒的疫情使得在线办公成为了一个常态,这使得在线文档成为了时下的热点。其中在线协同表格是在线文档的重要一个组成部分,纯前端表格在在线协同表格上有着得天独厚的优......
  • AcWing.7 混合背包问题
    题目描述有\(N\)种物品和一个容量是\(V\)的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用\(s_i\)次(多......
  • 背包模型
    背包模型概述​最长上升子序列:序列DP(相邻两个被选择的有关系)背包问题:组合DP,在全局的考虑之下最小f[i][j]:i表示搞了多少,j表示限制集合:所有仅仅从前i个物品当中选......
  • Acwing 12. 背包问题求具体方案
    Acwing12.背包问题求具体方案01背包问题,但是要求输出字典序最小的方案数。思路:状态转移方程:\(f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i])\)求具体......
  • P1757 通天之分组背包
    P1757通天之分组背包有\(N\)件物品和一个容量为\(V\)的背包。第\(i\)件物品的费用是\(C_i\),价值是\(W_i\)。这些物品被划分为\(K\)组,每组中的物品互相冲突,最......
  • Acwing 7. 混合背包问题
    Acwing7.混合背包问题有\(N\)种物品和一个容量是\(V\)的背包。物品一共有三类:第一类物品只能用\(1\)次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多......