c++ dp基础完全背包细讲

2024-02-08 00:08
文章标签 基础 c++ dp 背包 完全 细讲

本文主要是介绍c++ dp基础完全背包细讲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、完全背包是什么?
  • 二、使用方法
    • 1.完全背包
    • 2、理解
  • 三、代码
  • 例题


一、完全背包是什么?

一般是几种物品,一个容器,每种物品都可以无限拿,求最大价值

二、使用方法

1.完全背包

例题讲解:

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最
大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其	重量的和小于等于M
,而价值的和为最大。

输入格式:

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。 

输出格式:

仅一行,一个数,表示最大总价值。

限制:

空间限制:128MByte
时间限制:1秒

样例:

输入:10 4
2 1
3 3
4 5
7 9

输出:

max=12

这就是一道完全背包问题的模板题,

2、理解

在上一篇博客(https://blog.csdn.net/struct_cym/article/details/118569863)中写到了刷表法,现在还是用刷表法来做,但这里就不给大家画表了,就直接来理解吧

完全背包问题中,每个物品有无限件,也就是从每种物品的角度考虑,与它相关的策略并非选或者不选两种。而是:选0件、选1件、选2件…等等多种策略

现在我们可以借用0/1背包问题的策略,把每一种情况的的结果都计算出来,再找到最大者,存在dp数组里

转移方程如下:

dp[i][j]=max(dp[i-1][j-k*w[i]]+k*v[i])(在0<=k*value[i]<=j的情况下)

三、代码

代码如下:

#include <bits/stdc++.h>
using namespace std;
int dp[1000];
int w[100000],v[100000];
int main(){int m,n;cin>>m>>n;for(int i=1;i<=n;i++){cin>>w[i]>>v[i];}for(int i=1;i<=n;i++){for(int j=w[i];j<=m;j++){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}cout<<"max="<<dp[m];return 0;
}

例题

题目描述:

零崎有很多朋友,其中有一个叫做lfj的接盘侠。lfj是一个手残,他和零崎一起玩网游的时候不好好打本,天天看拍卖行,没过多久,就成为了一个
出色的商人。时间一长,虽然挣了不少钱,却没时间练级了。作为lfj的友人,零崎实在看不下去,于是他决定帮lfj一把。当然了,零崎肯定不会自己动手,活
还得你们来干。lfj可以提供给你们拍卖行所有能买到物品的价格和利润,由于游戏产出不限,所以可以假定只要有钱
,即使是同一种东西,多少个也都能买到手。lfj还会告诉你他初始的成本。虽然零崎想让你们给出
一次交易中利润最大的购买方案,但是lfj觉得只要知道最大利润就可以了。

输入:

每组数据第一行为两个整数P和N,表示本金和拍卖行物品种类数。接下来N行,每行两个数据pi,ci代表第i类物品的利润和购买价格。1<=P<=20000,1<=N<=300,1<=c,p<=200

输出

对于每组数据,输出一行,为能获得的最大利润

这道题是我从网上找的,可以用来练练手。没有样例,可以自己出几个样例测试一下自己的代码的正确性。

这篇关于c++ dp基础完全背包细讲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689361

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上