首页 > 其他分享 >AcWing 5. 多重背包问题 II

AcWing 5. 多重背包问题 II

时间:2023-09-11 15:05:59浏览次数:41  
标签:cnt 背包 int II 体积 物品 价值 AcWing

JWvFczgRNg.jpg

题目

有 $N$ 种物品和一个容量是 $V$ 的背包。

第 $i$ 种物品最多有 $s_i$ 件,每件体积是 $v_i$,价值是 $w_i$。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。

输入格式 第一行两个整数,$N,V$,用空格隔开,分别表示物品种数和背包容积。

接下来有 $N$ 行,每行三个整数 $v_i,w_i,s_i$,用空格隔开,分别表示第 $i$ 种物品的体积、价值和数量。

输出格式 输出一个整数,表示最大价值。

数据范围 $0<N≤1000$ $0<V≤2000$ $0<v_i,w_i,s_i≤2000$ 提示: 本题考查多重背包的二进制优化方法。

输入样例

4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:

10

思路

多重背包与完全背包不同,无法使用类似的优化方法。 多重背包优化可以使用二进制优化方法,对于物品 $i$ 最多取 $s$ 个,我们可以将 $s$ 个物品 $i$划分成多个堆,一个堆有着多个物品的体积和价值,与正常物品无差别,这样问题转换成了01背包问题。

代码

#include <iostream>

using namespace std;

const int N = 12010, M = 2010;

int v[N], w[N];
int f[M];

int main()
{
    int n, m;
    cin >> n >> m;

    // 二进制优化
    int cnt = 0;
    for (int i = 1; i <= n; i ++ )
    {
        int a, b, s;
        cin >> a >> b >> s;
        int k = 1;
        while (k <= s)
        {
            cnt ++ ;
            v[cnt] = a * k;
            w[cnt] = b * k;
            s -= k;
            k *= 2;
        }
        
        if (s > 0)
        {
            cnt ++ ;
            v[cnt] = a * s;
            w[cnt] = b * s;
        }
    }
    
    
    n = cnt;  // n重新赋值为统计的cnt
    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;
}

标签:cnt,背包,int,II,体积,物品,价值,AcWing
From: https://blog.51cto.com/u_16170343/7435939

相关文章

  • Acwing.第 120 场周赛
    Acwing.第120场周赛比赛链接A最大GCD给定一个正整数n(n≥2),请你确定两个正整数a,b,使得1≤a<b≤n,且gcd(a,b)尽可能大。输出gcd(a,b)的最大可能值。gcd(a,b)指a,b的最大公约数。提示:可以通过给定样例观察一下n和答案之间的关系。输入格式第一行包含整数T,表示共有T......
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II
    题目链接:剑指Offer56-II.数组中数字出现的次数II题目描述:在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。解法思路:代码:......
  • AtCoder Beginner Contest 044 C (背包DP、思维、*1583)
    C-TakandCards题意:给定$N$个正整数$x_1,x_2,\cdot\cdot\cdot,x_n$和一个正整数$A$,问从中选择$k$个数\((k>0)\),满足:这$k$个数的平均值是$A$的方案总数是多少?思路:......
  • 剑指 Offer 57 - II. 和为s的连续正数序列
    题目链接:剑指Offer57-II.和为s的连续正数序列题目描述:输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。解法思路:双指针:当总和小于target时,j指针向后移动,直到大于或等于停......
  • 背包模型
    状态表示是化零为整的过程,将一些零碎的数据化为一个集合状态计算是化整为零的过程,需要将上述得到的集合分解为具体的数据才能进行计算01背包问题描述有$N$件物品和一个容量是$V$的背包。每件物品只能使用一次。第$i$件物品的体积是$v_i$,价值是$w_i$。求解将哪些物品......
  • C++ 算法竞赛、03 周赛篇 | AcWing 第4场周赛
    AcWing第4场周赛竞赛-AcWing3694A还是B3694.A还是B-AcWing题库简单题#include<algorithm>#include<cstring>#include<iostream>usingnamespacestd;intn;inta,b;intmain(){cin.tie(0);charc;cin>>n;for(int......
  • 洛谷 P5218 无聊的水题 II
    洛谷传送门无聊的水题。根据裴蜀定理,显然能组合出任意值的充要条件是,选出的数的\(\gcd=1\)。设\(g(i)\)为在\(1\simn\)中选出若干个数使得它们\(\gcd=i\)的方案数,\(f(i)\)为在\(1\simn\)中选出若干个数使得它们\(\gcd\)是\(i\)的倍数的方案数。我们有:\[......
  • 【刷题笔记】45. Jump Game II
    题目Givenanarrayofnon-negativeintegers nums,youareinitiallypositionedatthefirstindexofthearray.Eachelementinthearrayrepresentsyourmaximumjumplengthatthatposition.Yourgoalistoreachthelastindexintheminimumnumberofju......
  • 【230908-17】▲ABC中,b=2,B=30°,C=45°,则S△ABC=?(2013年全国II卷)
    ......
  • 【IIS】HTTP 错误 405.0 - Method Not Allowed,无法显示您正在查找的页面,因为使用了无
    转自:https://blog.csdn.net/weixin_38211198/article/details/103597330问题HTTP 错误 405.0 - Method Not Allowed无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。 解决在IIS中,找到处理程序映射上面的报错已经指明是WebDAVModule模块,找到该模块  ......