多重背包模板

POJ 1276 多重背包+模板 题目 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31788   Accepted: 11460 Description A Bank plans to install a machine for cash withdra 阅读详情

题目:

有N种物品和一个容量为V的背包。第i种物品最多有num[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

多重背包动态规划过程:

    多重背包问题的思路跟完全背包的思路非常类似,只是k的取值是有限制的,因为每件物品的数量是有限制的,状态转移方程为:

    dp[i][v] = max{dp[i - 1][v - k * c[i]] + w[i] | 0 <=k <= n[i]}

    其中c[i]是物品的数量,和完全背包的不同支出在于完全背包可以取无数件,而多重背包给定了最多能取的数量。这样也是三个循环,分别是背包容量,物品个数和物品种类。这样如果数量比较多的情况,很明显这个做法也会超时,所以我们也要想更优化的方法去完善。

  转化为01背包问题
    转化为01背包求解:把第i种物品换成n[i]件01背包中的物品。考虑二进制的思想,考虑把第i种物品换成若干件物品,使得原问题中第i种物品可取的每种策略——取0..n[i]件——均能等价于取若干件代换以后的物品。另外,取超过n[i]件的策略必不能出现。

    方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为1,2,4,…,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。

    分成的这几件物品的系数和为n[i],表明不可能取多于n[i]件的第i种物品。另外这种方法也能保证对于0..n[i]间的每一个整数,均可以用若干个系数的和表示,证明我也没看过这里就不贴上了,主要还是需要去理解代码,代码在下面给出。

分析:状态转移为:这里写图片描述

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e6+1100;
int v[N], w[N], num[N];
int dp[N];
int n,m;

//01背包
void ZeroOnePack(int v, int w)
{
    for (int i = m; i >= v; i--)
    {
        dp[i] = max(dp[i], dp[i - v] + w);
    }
}
//完全背包
void CompletePack(int v, int w)
{
    for (int i = v; i <= m; i++)
    {
        dp[i] = max(dp[i], dp[i - v] + w);
    }
}
//多重背包
void MultiplePack(int v, int w, int num)
{
    if (v * num >= m)//如果总容量比这个物品的容量要小,那么这个物品可以直到取完,相当于完全背包
    {
        CompletePack(v, w);
        return ;
    }
    else//否则就将多重背包转化为01背包
    {
        int k = 1;
        while (k < num)
        {
            ZeroOnePack(k*v, k*w);
            num -= k;
            k *= 2;//这里采用二进制思想
        }
        ZeroOnePack(num*v, num*w);
    }
}
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++)
            scanf("%d%d%d", &v[i], &w[i], &num[i]);
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= n; i++)
            MultiplePack(v[i], w[i], num[i]);
        printf("%d\n", dp[m]);
    }
    return 0;
}
背包问题模板 组合背包(普通背包问题,完全背包,多重背包) 背包问题大部分都是模板题,这里整理了组合背包的模板。 组合背包:物品的可取数目为1,有限个或无限个。 也就是说该模板适用于01背包,完全背包,多重背包 ——————————————————————— 对于可取数目不为一的处理思路: 我们将该物品的数目,分解成几个2的幂次的和1,2,4……, 多余出来的也放进去,再将这些数乘以原价值,原重量,单作不同的物品加进去。为什么要这么做呢?假设我们当我们取k件该物品时,k同样可以看成分解出来的数的组合。然后就是普通背包的思路了。 #include<stdio.h 阅读详情

相关推荐

Nginx源码安装和基础配置

Nginx简介 nginx: 世界第二大web服务器软件,以高并发、低消耗著称,源自于俄罗斯,创建者 Igor(伊戈尔),2004年开源,最早以代理服务器的身份出现,2015成立nginx公司,2019年以6.7亿被F5 Networks公司收购。 代理服务器: 正向:squid 反向: squid:最古老的代理服务器 LVS: 优点: 1.抗负载能力强、是工作在网络4层之上仅作分发之用 2.配置性比较低,这是一个缺点也是一个优点,简单不易出错 3.工作稳定,抗负载能力很强,有完整的双机热备方案

hjyhjy0的博客 500

[背包] 背包问题算法模板(模板)

文章目录0. 前言1. 01背包2. 完全背包3. 多重背包4. 分组背包 0. 前言 背包问题是众多 dp 问题的母题,是一个很重要的知识点。该博文基于背包九讲总结,会将背包九讲内容及模板题全部总结一般,也是鉴于学习进度,目前仅总结了 01 背包及优化模型,完全背包,多重背包,分组背包。 初次系统学习背包问题,总结不够到位,往各位同学批评指正!十分感谢~ 背包问题共性: n 个物品,一个容量为 v 的背包 每个物品两个属性,体积 vi,价值 wi 要求在这些物品中挑总体积不大于 v 的物品并使背包装入

Y-puyu 的博客 4503

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

多重背包(模板)

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。把相同的物品按2的n次方进行分组,然后按01背包的思想对分好组的物品进行挑选。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。第 i种物品最多有 si 件,每件体积是 vi,价值是 wi。有 N 种物品和一个容量是 V 的背包。输出一个整数,表示最大价值。

韩帅的博客 274

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4451

知识图谱-Neo4j-开始构建知识图谱-01

关系(Relationships):连接两个节点,具有方向(→ 或 ←)和类型(Type),可附加属性。 属性(Properties):键值对,存储节点或关系的详细信息(如 , )。 (2) Cypher 查询语言 直观语法:通过模式匹配直接描述图结构。 高效遍历:支持复杂关系路径查询(如最短路径、模式匹配)。 3. 核心优势 (1) 原生图存储 物理存储优化:数据以图结构直接存储,避免传统数据库的“表连接”开销。 高效遍历:通过指针直接访问相邻节点,时间复杂度接近 O(1)。 (2) 高性

寓教于乐。教己助人 1万+

C++多重背包模板

把1个物品看为体积为v[i],价值为w[i],把2个物品看为体积为2*v[i],价值为2*w[i],把4个物品看为体积为4*v[i],价值为4*w[i],再对它们进行完全背包的优化。,如,我们可以用1(0001)2(0010)4 (0100)组成7(0111),那么我们是不是可以将某个物品的使用次数s[i]拆分成由二进制。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

inhuibin的博客 1489

使用SpringBoot+Vue3开发项目(1)---- 设计用户注册和登录的接口及页面

本文基于黑马大事件项目介绍如何使用SpringBoot+Vue3来实现前后端联调的登录与注册操作。

记得开心一点嘛的博客 3642

动态规划

动态规划: 1.最优子结构(大问题分解出小问题) 2.无后效应 求解步骤 1.观察:大问题与小问题的联系 2状态定义:数组如何定义 3.推导状态转移方程 4.初始化 leetcode322 零钱兑换 class Solution { public: int coinChange(vector<int>& coins, int amount) { vector<int>ans(amount+1,INT_MAX /2); ans[0]=0;

陈子龙的博客 253

NXP S32K1 SPI驱动实战:从配置到DMA传输的完整流程解析

本文深入解析了NXP S32K1系列MCU的SPI驱动开发全流程。基于S32 Design Studio环境,详细阐述了从引脚配置、LPSPI模块初始化,到实现阻塞、中断及DMA三种传输模式的实战代码与配置要点。文章重点剖析了DMA传输的配置细节与性能优化,旨在帮助开发者构建高效、稳定的嵌入式SPI通信,并提供了SPI Flash驱动的综合案例。

blue42的博客 713

基于PINN求解裂纹扩展问题的优化开发

本文提出了一种基于物理信息神经网络(PINN)的裂纹扩展问题求解方法。通过将线弹性断裂力学控制方程和裂纹尖端场特性嵌入神经网络损失函数,PINN有效克服了传统有限元法在处理裂纹扩展时面临的网格重构困难、计算成本高等问题。文章详细介绍了PINN网络架构设计、裂纹尖端奇异场处理、损失函数构造以及优化策略等关键技术。数值实验表明,该方法能准确预测裂纹扩展路径和应力强度因子,且在处理复杂几何和动态扩展问题时展现出显著优势。相比传统方法,PINN具有无网格、并行计算友好等特点,为断裂力学问题提供了新的求解范式。

huanghm88的专栏 152

多重背包模板 C++

多重背包模板 多重背包: 有N种物品和一个容量为V的背包。第i种物品最多有numi件可用。 每件物品的重量是wi,价值是vi。 求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。 const int maxn = 100005; int w[maxn], v[maxn], num[max...

Patience 2105

看完就会!手把手教您如何正确开启飞牛Nas 虚拟机的 IOMMU 硬件直通,让虚拟机的性能飙升!

看完就会!手把手教您如何正确开启飞牛Nas 虚拟机的 IOMMU 硬件直通,让虚拟机的性能飙升!

XiaoqiangClub的博客 1万+

01背包 完全背包 多重背包 求价值 求方案数 各种模板

菜得只能背模板…QAQ 文章目录01背包(求最大价值)完全背包(求最大价值)多重背包(求最大价值)01背包(求方案数)其他变形题 01背包(求最大价值) 模板题:AcWing 01背包问题 N为物品数,V为背包体积 v[i],w[i]分别表示第i件物品的体积和价值 f[j]表示体积最大为j的最大价值 for(int i=1;i<=N;i++) { for(int j=V;j>=v[i];j--) { f[j]=max(f[j],f[j-v[i]]+w[i]); } } 完全背包(求

qq_45498200的博客 1007

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

01背包、完全背包、多重背包模板

三种背包概念 01背包(ZeroOnePack): 有N件物品和一个容量为V的背包。每种物品均只有一件。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 完全背包(CompletePack): 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总...

盛夏与微风 522

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

01背包,完全背包,多重背包,分组背包的使用条件以及代码模板

背包问题算是动态规划中的入门题目了,背包问题有很多种。背包九讲中讲的很清楚,我就不班门弄斧了,针对几种比较常见的背包问题,阐述一下它的使用前提和代码模板。 1.01背包问题 题目 有N 件物品和一个容量为V 的背包。第i ii件物品的费用是w[i] ,价值是v[i],求将哪些物品装入背包可使价值总和最大。 这种基础的01背包问题,一般有两种代码书写规则,一种是二维数组,一种是一维数组。个人比较推荐...

starlet_kiss的博客 400

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

01背包 完全背包 多重背包 分组背包Python模板

背包模板Python 根据Acwing里y总的代码,写了个Python的版本几个典型的背包问题的模板 01背包 完全背包 多重背包 分组背包 提示:以下是本篇文章正文内容,下面案例可供参考 一、01背包 ##01背包## n, m = map(int ,input().split()) v = [0] * (n + 1) w = [0] * (n + 1) f = [0] * (m + 1) for i in range(1, n + 1): v_, w_ = map(int, input().s

weixin_45794405的博客 1024

POJ 1276 Cash Machine(多重背包模板)

多重背包模板: #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[100009];int a[20];int num[1009]; int main(){ int al; while(cin>>al){ int n;cin&...

Ellery的book 177

[AcWing] 4. 多重背包问题 I(C++实现)多重背包问题 I模板题

[AcWing] 4. 多重背包问题 I(C++实现)多重背包问题 I模板题1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路: 闫式dp分析法 用闫式dp分析法分析多重背包问题 分析过程大致同如下的完全背包问题,完全背包问题是第 i 件物品可以选任意多个,而多重背包问题只限制了第 i 件物品最多选 s[i] 个,加上这条限制即可。 以下是完全背包问题的分析: 3. 解法 ---

cloud的博客 805

背包问题模板(01背包,完全背包,多重背包)

背包问题模板(01背包,完全背包,多重背包) 背包问题作为一类非常常见的问题,这里给出背包问题(01背包,完全背包,多重背包)的模板,以后自己做题就很方便啦。 这里以多重背包为例一并给出main()函数代码。

Talk is cheap,give me the code! 899

dp背包模板(01、完全、多重)

背包模板 01背包 dp[j]记录当容量为j时的可行取法的最大价值 状态转移方程dp[j]=max(dp[j],dp[j-w[i]]+v[i]) 注意内层循环为逆序 #include<stdio.h> int dp[1005]; int main() { int T,n,i,j,s,v[1005],w[1005]; scanf("%d", &T);//循环次数 whi...

weixin_45461859的博客 289

多重背包 【模板】

多重背包 【模板】

2403_87530627的博客 722

动态规划之01背包,完全背包,多重背包模板

自己整理的模板,记录一下:#include <iostream> #include <vector> #include <deque> #include <algorithm>using namespace std;const int M = 500; const int N = 500;#pragma region"01背包问题" // 未优化版 int pack01(vector<int>& w

唐唐唐唐人的博客 543
上一篇: 最长上升子序列 最长公共子序列
下一篇: 01背包和完全背包
Puppet__
博客等级 码龄9年 319粉丝 328原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值