动态规划 01背包与完全背包问题【C++】

C++ 算法篇 动态规划----背包之一 01背包 一、01背包 题目:有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 w[i],价值是 p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 例,有3个物品,背包容量为10,如下: 二维解法: #include<bits/stdc++.h> using namespace std; int f[50][220]={... 阅读详情

目录

01背包问题

递归做法

递推做法(二维)

递推做法(一维)

完全背包问题

递归做法

递推做法


01背包问题

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

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

递归做法

#include<bits/stdc++.h>
using namespace std;

int N,V;
int v[1010],w[1010],d[1010][1010];
int dp(int i,int j){
    if(d[i][j]) return d[i][j];
    if(i>N) return 0;
    if(j-v[i]>=0) d[i][j]=max(dp(i+1,j-v[i])+w[i],dp(i+1,j));
    else d[i][j]=dp(i+1,j);
    return d[i][j];
}
int main(){
    cin >> N >> V;
    for(int i=1;i<=N;i++)
        cin >> v[i] >> w[i];
    cout << dp(1,V);
    return 0;
}

递推做法(二维)

#include<bits/stdc++.h>
using namespace std;

int N,V;
int v[1010],w[1010],d[1010][1010];
int main(){
    cin >> N >> V;
    for(int i=1;i<=N;i++)
        cin >> v[i] >> w[i];
    memset(d,0,sizeof(d));
    for(int i=1;i<=N;i++){
        for(int j=1;j<=V;j++){
            if(j-v[i]>=0)
                d[i][j]=max(d[i-1][j-v[i]]+w[i],d[i-1][j]);
            else
                d[i][j]=d[i-1][j];
        }
    }
    cout << d[N][V];
    return 0;
}

递推做法(一维)

#include<bits/stdc++.h>
using namespace std;
 
int N,V;
int v[10010],w[10010],d[10010]={0};
int main(){
    cin >> N >> V;
    for(int i=1;i<=N;i++)
        cin >> v[i] >> w[i];
 
    for(int i=1;i<=N;i++)
        for(int j=V;j>=v[i];j--)
            d[j]=max(d[j],d[j-v[i]]+w[i]);
 
    cout << d[V] << endl;
    return 0;
}

完全背包问题

有 N 件物品和一个容量是 V 的背包。每种物品都有无限件可用。

第 i 件物品的体积是 vi,价值是 wi。

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

递归做法

#include<bits/stdc++.h>
using namespace std;

int N,V;
int v[1010],w[1010],d[1010]={0};
int dp(int m){
    if(d[m]) return d[m];
    for(int i=1;i<=N;i++){
        if(m-v[i]>=0) d[m]=max(d[m],dp(m-v[i])+w[i]);
    }
    return d[m];
}
int main(){
    cin >> N >> V;
    for(int i=1;i<=N;i++)
        cin >> v[i] >> w[i];
    cout << dp(V);
    return 0;
}

递推做法

#include<bits/stdc++.h>
using namespace std;

int N,V;
int v[1010],w[1010],d[1010]={0};
int main(){
    cin >> N >> V;
    for(int i=1;i<=N;i++) cin >> v[i] >> w[i];

    for(int i=1;i<=V;i++)
        for(int j=1;j<=N;j++)
            if(i-v[j]>=0) d[i]=max(d[i],d[i-v[j]]+w[j]);

    cout << d[V];
    return 0;
}

动态规划——完全背包问题(C++实现) 阅读详情

相关推荐

0/1背包的c++代码实现

0/1背包问题,其中包括计算单目标的背包问题所获得的最大值

c++01背包问题

现在有n个物品,每个物品的重量为w[i],价值为v[i]。如果选当前物品,则最大价值就是前i-1个物品中,体积为j-w[i]的最大价值加上当前物品的价值v[i],即f[i-1][j-w[i]]+v[i]。在该代码中,我们使用f[i][j]表示选前i个物品,体积为j时的最大价值,其中i=1,2,3,...,n,j=0,1,2,...,m。如果不选当前物品,则最大价值就是前i-1个物品中,体积为j的最大价值f[i-1][j]。其中,每个物品只有一个,要么装入背包,要么不装,因此称为01背包问题。

2301_76180325的博客 1407

WinIDEA基于IC5000烧录代码和调试教程

winIDEA就是ic5000用来烧录代码和调试代码的上位机,本文旨在介绍其如何去烧录代码并且调试

m0_56208280的博客 4163

算法(c++)——0-1背包问题

算法(c++)——0-1背包问题:0-1背包问题。现有n件物品和个容量为c的背包。第i件物品的重量是重量为w[i],价值v[i]。已知对于一件物品必须选择取(用1表示)或者不取(用0表示),且每件物品只能被取一次(这就是“0-1"的含义)。求放置哪些物品进背包,可使这些物品的重量总和不超过背包容量,且价值总和最大。运用动态规划法实现背包最大价值最优装载方式。

高冷男孩不吃苹果的博客 4696

突发E层(Es层):短波通信中的“意外惊喜”与“隐形杀手”全解析

本文深入解析了突发E层(Es层)在短波通信中的双重作用,既可能带来超远距离通信的“意外惊喜”,也可能成为通信链路的“隐形杀手”。通过分析Es层的形成机制、时空分布规律及实战应用技巧,帮助通信爱好者与专业人员更好地利用或应对这一电离层现象,提升短波通信的可靠性与效率。

weixin_30443813的博客 823

实测OV5640 DVP/MIPI接口720p@60fps配置,为什么我的Zynq-7020开发板只有30帧?

本文深入解析了OV5640摄像头在Zynq-7020开发板上帧率减半的问题,从寄存器配置到硬件链路进行全面排查。重点分析了DVP/MIPI接口的720p@60fps配置,提供了关键寄存器设置、时序参数调整及硬件带宽验证方法,帮助开发者快速定位并解决帧率下降问题。

weixin_42634811的博客 344

背包问题的动态规划C++实现(01背包和完全背包)

0,1背包 为方便起见,令零件价值等于其长度 #include<iostream> #include<vector> #include<ctime> #include<iomanip> using namespace std; void zeroOneKnapsack(vector<vector<int>>& path,vector<int>& result, const vector<int>

mingcaixiao的博客 1730

C++ 工程实践(9):数据抽象

陈硕 (giantchen_AT_gmail)http://blog.youkuaiyun.com/Solstice  http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: http://blog.youkuaiyun.com/Solstice/category/8

陈硕的Blog 1万+

01背包问题(c++)

01背包问题是最经典的背包问题下面是我的代码,思路比较清晰。

weixin_62602974的博客 966

ArcGIS 10.8软件安装包免费下载及安装教程

ArcGIS 10.8安装教程

qq_44894692的博客 2万+

ardupilot 方向余弦矩阵/旋转矩阵的理解

本节主要记录自己对ardupilot中用到的方向余弦矩阵/旋转矩阵的理解,欢迎批评指正,有些资料参考网上写的比较好的资料,免得查找资料麻烦。旋转矩阵的坐标理解:表示从旋转矩阵的下标的坐标系的坐标变换到上标表示的坐标系坐标下。旋转矩阵的坐标系理解:表示从旋转矩阵的上标的坐标系变换到下标表示的坐标系下。从旋转矩阵的投影更好理解,比如下面旋转矩阵的第一行是左边坐标系的第一维分量在右边坐标系的投影。

陌城烟雨 612

背包九讲——混合背包问题

混合背包问题是背包问题的另一种变体,结合了0/1背包、多重背包和完全背包的特点。在混合背包问题中,每种物品可以选择放入背包的次数是有限的,而且也可以选择放入的数量是无限的。问题的描述如下:给定一个背包容量为m,有n种物品,每种物品有重量v[i]、价值w[i]、以及数量s[i]。其中,s[i]表示第i种物品的数量限制。目标是选择物品放入背包,使得它们的总重量不超过背包容量,并且总价值最大。

闻道有先后,术业有专攻 3050

半车(前后、左右)、整车悬架详细推导建模和simulink仿真分析

用达朗贝尔定理依据悬架数学模型,得到悬架模型微分方程,分别用simulink建立前后半车、左右半车悬架;结合转向2自由度模型与半车侧倾模型,对模型考虑相干性、延时性的C级随机路面下,仿真分析给定角阶跃输入下的侧倾稳定性。

Mr.邹的博客 1万+

c++01背包完全背包多重背包问题(动态规划求解)

之前在屈老的课上用的是动态规划解,现在有机会看到b站某视频的动态规划求解的具体写法,故在此更新博文,今天虽然2022大年初一,但不减学习热情。

执念斩长河 560

prplOS组件流程梳理

本文梳理了prplOS系统中设备信息管理模块(deviceinfo-manager)的工作流程。该模块启动时通过/etc/init.d/deviceinfo-manager调用核心框架amxrt执行,主要功能包括收集设备信息、管理数据模型、初始化子系统等。系统采用ODL文件定义数据模型,通过解析器将配置文件转换为内存中的对象树。流程涉及命令行参数解析、ODL文件加载、后端模块扫描等核心步骤,最终构建出完整的数据模型供上层应用访问。整个架构体现了模块化设计思想,通过动态加载插件实现功能扩展。

四儿家的小祖宗的博客 1268

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

c++背包问题讲解

《背包问题详解与优化策略》摘要:本文系统讲解了五大经典背包问题及其优化方法。01背包通过倒推一维数组实现空间优化;完全背包采用正推形式处理无限物品;多重背包可通过暴力或二进制拆分转化为01背包;分组背包在每组限选一件下进行状态转移;混合背包则综合处理不同限制条件。文章以超市偷窃为例引入问题,结合动态规划思想,提供了清晰的代码实现和状态转移方程,帮助读者掌握背包问题的核心解法与优化技巧。

chenjs2011的博客 1807

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

01背包问题,完全背包问题,多重背包问题C++实现

01背包问题,完全背包问题,多重背包问题C++实现 01背包问题: 有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci1,得到的 价值是 Wi。求解将哪些物品装入背包可使价值总和最大。 完全背包问题: 有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。放入第 i 种物品 的费用是 Ci,价值是 Wi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总 和不超过背包容量,且价值总和最大。 多重背包问题: 有 N 种物品和一个容量为 V 的背包。第 i

li123_123_的博客 803

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

动态规划之背包问题

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V? 背包问题一般分为以下几类: 1.01背包问题 2.完全背包问题 3.多重背包问题 4.分组背包问

yaozizhi_yang的博客 2221

动态规划--01背包问题

问题描述 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8 i(物品编号) 1 2 3 4 w(体积) 2 3 4 5 v(价值) 3 4 5 6 总体思路...

漆灿 313

盖子的c++小课堂——第二十七讲:背包变形题

记得点赞关注加收藏~~~ღ( ´・ᴗ・` )比心

盖子小课堂 1157

c++混合背包问题(多重背包二进制优化)

混合背包问题是指在一个背包中可以装入多种不同的物品,每种物品有自己的重量和价值,同时每种物品又有固定的数量限制。表示物品的数量限制。如果该物品数量无限,则将该物品视为完全背包问题,按照完全背包的方式添加重量和价值。如果该物品数量为1,则将该物品视为01背包问题,添加一次该物品的重量和价值即可。最终,将所有物品按照上述方式进行转换并加入背包中,即可得到混合背包问题的最优解。如果该物品数量有限,则将该物品视为多次背包问题,采用一般化方法进行计算。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

2301_76180325的博客 805

【动态规划】背包问题模板

【代码】【动态规划】背包问题模板。

un_fired的博客 388

动态规划DP——背包问题

目录一、01背包问题1. 题目介绍2. 题解代码(C++)2.1 版本1 二维2.2 版本2 一维2.3 版本3 优化输入二、完全背包问题1.三维朴素做法(容易超时)2.二维做法(优化)​ 3.一维做法(最优化)三、多重背包问题四、分组背包问题有 N 件物品和一个容量为 V 的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,装入的物品总价值最大。「0-1 背包」是较为简单的动态规划问题,也是其余背包问题的基础。动态规划是不断决策求最优解的过程,「0-1 背包」即是不断对第 ii 个物品的

m0_64378422的博客 592

动态规划之01背包和完全背包问题(力扣C++题解)

强烈推荐代码随想录!!!(纯路人)

lihua777的博客 1434

背包九讲 之 完全背包思路题解

完全背包问题 本文基于01背包问题 问题重述 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的...

actioncms的博客 340

解锁背包问题:C++实现指南

背包问题是计算机科学中的经典优化问题,常出现在算法研究和编程面试中。它是组合优化的一个例子,可以用来演示动态规划的强大之处。本文将介绍背包问题的两种变体:01背包和完全背包,以及它们的C++实现。

猪肉炖粉条的博客 701
上一篇: 练习19,线段和点【贪心】
下一篇: 练习20,RMQ问题 数列区间最大值【线段树】
ILECY
博客等级 码龄11年 26粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ILECY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值