问题描述:

现在给你一个容量为V的背包,有N个物品,其中第i件物品的重量为wi,价值为vi,第i件物品一共有si件,问在有限的容量内,最多可以拿到多少价值的物品。

题目分析:

仔细一看,多重背包问题和完全背包问题的差距就在物品的个数上,完全背包问题是同一类物品有无数件,但多重背包不让着你,多重背包给你规定了最多件数。仔细看看还挺有意思,01背包是要么0件要么1件,多重背包是要么可以选0~si件,而完全背包则是可以选0~∞件。

那我们拓展一下思维,这是规定了同类物品最多能拿的个数,要是规定了第i类物品最少要拿多少件呢?很容易想到,只需要初始化的时候提前拿一些,就转换成了01背包问题咯(题外话题外话)

回归正题,多重背包问题就是在完全背包问题加了一个限制条件,“最多能拿si件”。那我们只需要改一改完全背包问题的代码,不就迎刃而解了吗?

假设取前i件物品装入容量为V的背包,第i件物品拿k件所得到的最大值为dp[i][j]

那么dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i])这里的k的范围是:0≤k≤s[i]

于是代码如下...

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=1e3+7;
int w[MAXN],N,V,v[MAXN],dp[MAXN][MAXN],s[MAXN];
int main()
{memset(dp,0,sizeof(dp));cin>>V>>N;for(int i=1;i<=N;i++){cin>>w[i]>>v[i]>>s[i];}for(int i=1;i<=N;i++){for(int j=0;j<=V;j++){for(int k=0;k<=s[i]&&k*w[i]<=j;k++){dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);}}}cout<<dp[N][V]<<endl;return 0;
}//二维
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=1e3+7;
int w[MAXN],N,V,v[MAXN],dp[MAXN],s[MAXN];
int main()
{memset(dp,0,sizeof(dp));cin>>V>>N;for(int i=1;i<=N;i++){cin>>w[i]>>v[i]>>s[i];}for(int i=1;i<=N;i++){for(int j=V;j>=0;j--){for(int k=0;k<=s[i]&&k*w[i]<=j;k++){dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);}}}cout<<dp[V]<<endl;return 0;
}//一维

ACM算法笔记(八)背包问题_多重背包相关推荐

  1. 九十、动态规划系列背包问题之多重背包

    @Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...

  2. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  3. 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)

    @Author:Runsen @Date:2020/9/17 多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤.在多重背包的问题,其实更多的是考查多重背包的二进制优化方法.学习二进制优化 ...

  4. 动态规划 —— 背包问题 P03 —— 多重背包

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

  5. 背包问题之多重背包基础写法

    #多重背包问题 多重背包其实可以看做01背包问题的变形,某种物品有规定可取次数,我们可以看多有多个这种相同的物品,然后进行01背包求解. 看一个例题: 悼念512汶川大地震遇难同胞--珍惜现在,感恩生 ...

  6. 动态规划背包问题之多重背包详解

    背包问题前几篇文章: 01背包详解 完全背包详解 文章目录 一.什么是多重背包问题? 二.例题分析 1. 题目: 2.第一种:朴素做法 3.第二种:二进制优化 4.第二种:单调队列优化<待写&g ...

  7. 多重背包单调队列优化思路_多重背包之单调队列优化理论性总结

    多重背包之单调队列优化: 若用F[j]表示对容量为j的背包,处理完前i种物品后,背包内物品可达到的最大总价值,并记m = min(n, j / v).放入背包的第i种物品的数目可以是:0.1.2--, ...

  8. 人工智能实现a*算法解决八数码_小白带你学回溯算法

    微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法 上一期算法回顾--贪婪法:https://mp.weixin.qq. ...

  9. 算法笔记--八个常见排序算法总结

    一. 分类描述 1. 插入排序 直接插入排序:算法简单,稳定,适用于数据量小的情况 希尔排序:直接插入排序的改进版,不稳定,对于待排序序列的不同情况效率相近 2. 交换排序 冒泡排序:算法简单,稳定, ...

最新文章

  1. php拍照从手机相册中选择,微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例...
  2. Canvas实用库Fabric.js使用手册
  3. android sharesdk分享功能,Android ShareSDK快速实现分享功能
  4. 电大计算机基础知识考题,2016年电大计算机基础知识模拟试题.doc
  5. mysql 存储过程调用权限消失的问题,恢复权限
  6. I had no sooner finished eating than went to toilet.
  7. centos中文目录换成英文目录
  8. Homebrew简介和基本使用
  9. 打开Jupyter Notebook 时报错:EnvironmentLocationNotFound: Not a conda environment:
  10. 多层full-connect 神经网络测试
  11. 博客笔记二: [京东白条,美团] 用户评分卡,在线广告模型
  12. 改变世界的十大计算机病毒(图)
  13. 10种优化Mac以获得最佳性能的简便方法
  14. 微信公众号发红包功能,现金红包、裂变红包接口
  15. C5750X7R2E105K230KA(电容器)MSP430F5249IRGCR微控制器资料
  16. 17家中国初创IT公司的失败史【转】
  17. 深信服培训--网络设备常见的部署模式
  18. 巧吃支付宝新年红包,再也不用担心钱花不出去了(售货机里面的饮料售空也没事哦)
  19. 京东API详情接口调用示例
  20. Eclipse 安装 Jrebel插件

热门文章

  1. Android 实现live555 RTSP代理播放器
  2. rand.nextint()的用法
  3. 关于获取宽带拨号密码
  4. 微带(Micro strip)——学习笔记
  5. 输入年月日,计算该天是当年的第几天?(java)
  6. 数据科学项目:适用于App Store和Google Play的有利可图的应用配置文件
  7. ia64linux内核:设计与实现,The Linux/ia64 project: kernel design and status update
  8. HDU-4856 Tunnels(BFS状压DP)
  9. eclipse tomcat启动失败
  10. C语言实现Flybird