背包问题求方案数、具体方案
背包问题求方案数、具体方案
- 01背包问题求体积恰好等于V的方案数
- 完全背包问题求体积恰好等于V的方案数
- 01背包问题求最优选法的方案数
- 完全背包问题求最优选法的方案数
- 01背包问题求具体方案
01背包问题求体积恰好等于V的方案数
原题链接AcWing278. 数字组合

考虑状态表示:
f[i][j]表示考虑前1~i个物品,体积恰好为j时的方案数(不考虑前1~i个物品组合后的价值,只考虑组合后的体积)状态转移:
可以分两种情况
选第i个物品使得体积为j
不选第i个物品使其体积为j
第i个物品体积为v,价值为w可以发现f[i][j]由上述两种情况构成,所以
f[i][j]=f[i-1][j]+f[i-1][j-v]
因为是体积恰好是j,所以初始化时
memset(f,0,sizeof f)
f[0][0]=1;
再对空间复杂度进行优化
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=10010;
int f[M];//f[i][j]表示考虑前1~i个物品,体积恰好为j时的方案数int main(){int n,m;cin>>n>>m;f[0]=1;for(int i=0;i<n;i++){int v;scanf("%d",&v);for(int j=m;j>=v;j--)f[j]=f[j]+f[j-v];}cout<<f[m]<<endl;return 0;
}
完全背包问题求体积恰好等于V的方案数
原题链接AcWing 1023. 买书

物品数量无限,这是一道完全背包求方案数问题
考虑状态表示:
f[i][j]表示考虑前1~i个物品,体积恰好为j时的方案数(不考虑前1~i个物品组合后的价值,只考虑组合后的体积)状态转移:
可以分多种情况
不选第i个物品使其体积为j f[i-1][j]
选1个第i个物品使得体积为j f[i-1][j-v]
选2个第i个物品使得体积为j f[i-1][j-2*v]
.....
选s个第i个物品使得体积为j f[i-1][j-s*v]
第i个物品体积为v,价值为w可以发现f[i][j]由上述s+1种情况构成,所以
f[i][j]=f[i-1][j]+f[i-1][j-v]+f[i-1][j-2*v]+.....+f[i-1][j-s*v]
而
f[i][j-v]=f[i-1][j-v]+f[i-1][j-2*v]+.....+f[i-1][j-s*v]
所以
f[i][j]=f[i-1][j]+f[i][j-v]
因为是体积恰好是j,所以初始化时
memset(f,0,sizeof f)
f[0][0]=1;
再对空间复杂度进行优化
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1010;
int f[N];
int d[4]={10,20,50,100};
int main(){int n;cin>>n;f[0]=1;for(int i=0;i<4;i++)for(int j=d[i];j<=n;j++)f[j]+=f[j-d[i]];cout<<f[n];return 0;
}
01背包问题求最优选法的方案数
AcWing 11. 背包问题求方案数

考虑状态表示:
f[i][j]表示考虑前1~i个物品, 体积恰好为j时的最大价值
g[i][j]表示考虑前1~i个物品,体积恰好为j时(最大价值)时的方案数状态转移:
可以分两种情况
选第i个物品使得体积为j
不选第i个物品使其体积为j
第i个物品体积为v,价值为w可以发现f[i][j]由上述两种情况构成,所以
f[i][j]=max(f[i-1][j],f[i-1][j-v]+w)
f[i-1][j]==f[i-1][j-v]+w时,g[i][j]=g[i-1][j-v]+g[i-1][j]//选不选i都行,可以从两种状态转移而来
f[i-1][j]<f[i-1][j-v]+w时,g[i][j]=g[i-1][j-v]//考虑要求最大价值时的方案数,只能从一种状态转移而来
f[i-1][j]>f[i-1][j-v]+w时,g[i][j]=g[i-1][j]//考虑要求最大价值时的方案数,只能从一种状态转移而来
因为是体积恰好是j,所以初始化时
memset(f,-0x3f,sizeof f)
f[0][0]=1;
memset(g,0,sizeof g)
g[0][0]=1;
再对空间复杂度进行优化因为求得的是在每个体积的最大价值,不同的体积可能有相同的最大价值,
最后需要将所有有最大价值不同体积方案数累加求和
代码如下:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010,mod=1e9+7;
int f[N];
int g[N];
int main(){int n,m;cin>>n>>m;memset(f,-0x3f,sizeof f);//求体积恰好等于j的最大价值f[0]=0;g[0]=1;//求体积恰好等于j的最大方案数for(int i=0;i<n;i++){int v,w;scanf("%d%d",&v,&w);for(int j=m;j>=v;j--){int cnt;if(f[j]<f[j-v]+w) cnt=g[j-v];else if(f[j]==f[j-v]+w) cnt=g[j-v]+g[j];else cnt=g[j];g[j]=cnt%mod;f[j]=max(f[j],f[j-v]+w);}}int res=0;for(int i=0;i<=m;i++) res=max(res,f[i]);//找出最大价值int cnt=0;for(int i=0;i<=m;i++) //找出所有体积不同的最大价值,每个体积有不同的方案数,累加求和if(f[i]==res) cnt=(cnt+g[i])%mod;cout<<cnt<<endl;return 0;
}
完全背包问题求最优选法的方案数
从上面的几个例子我们也可以求出完全背包问题最大价值时的方案数
没有例题
代码如下:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010,mod=1e9+7;
int f[N];
int g[N];
int main(){int n,m;cin>>n>>m;memset(f,-0x3f,sizeof f);//求体积恰好等于j的最大价值f[0]=0;g[0]=1;//求体积恰好等于j的最大方案数for(int i=0;i<n;i++){int v,w;scanf("%d%d",&v,&w);for(int j=v;j<=m;j++){//改动在这里int cnt;if(f[j]<f[j-v]+w) cnt=g[j-v];else if(f[j]==f[j-v]+w) cnt=g[j-v]+g[j];else cnt=g[j];g[j]=cnt%mod;f[j]=max(f[j],f[j-v]+w);}}int res=0;for(int i=0;i<=m;i++) res=max(res,f[i]);//找出最大价值int cnt=0;for(int i=0;i<=m;i++) //找出所有体积不同的最大价值,每个体积有不同的方案数,累加求和if(f[i]==res) cnt=(cnt+g[i])%mod;cout<<cnt<<endl;return 0;
}
应该是对的
01背包问题求具体方案
原题链接:AcWing 12. 背包问题求具体方案

01背包求具体方案只需要回溯输出结果就行
因为我们可以知道当前这一状态是从哪一个状态转移而来
因为题目要求字典序最小,所以可以反着算,正着回溯输出即可
代码如下:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;int f[N][N];
int v[N],w[N];int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);for(int i=n;i>=1;i--)for(int j=0;j<=m;j++){f[i][j]=f[i+1][j];if(j>=v[i]) f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);}for(int i=1,j=m;i<=n;i++)if(j>=v[i] && f[i][j]==f[i+1][j-v[i]]+w[i]){cout<<i<<" ";j-=v[i];}return 0;
}
相关文章:
背包问题求方案数、具体方案
背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…...
电商导购CPS,淘宝联盟如何跟单实现用户和订单绑定
前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…...
【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc,bmc_wtd,
文章目录1.shell语法:Shell是用C语言编写的程序,它是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&am…...
刷题记录:牛客NC208250牛牛的最美味和最不美味的零食
传送门:牛客 题目描述: 牛牛为了减(吃)肥(好),希望对他的零食序列有更深刻的了解,所以他把他的零食排成一列,然后对每一 个零食的美味程度都打了分,现在他有可能执行两种操作&…...
微搭低代码从入门到精通08-轮播容器
我们上一篇讲解了基础布局组件,讲解了普通容器和文本组件的用法,本篇我们继续介绍布局组件。 小程序中经常会有个功能是轮播图展示的功能,多张图片可以顺序进行切换。我们学习使用轮播容器的时候,先考虑切换的图片从哪来…...
分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测
分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测 目录分类预测 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测分类效果基本介绍模型描述程序设计参考文献分类效果 基本介绍 1.Matlab实现SSA-CNN麻雀算法优化卷积神经网络多特征分类预测&…...
华为10年经验测试工程师,整理出来的python自动化测试实战
前言 全书共分11章,第一章是基础,了selenium家谱,各种组件之间的关系以及一些必备知识。第二章告诉如何开始用python IDLE写程序以及自动化测试环境的搭建。第三章是webdriver API,我花了相当多时间对原先的文档,冗余…...
OpenCV杂谈 - 如何导出图像到内存中其他结构
前言 最近在net环境使用OpenCV,记录些疑难杂点. 一、OpenCV主要结构 Mat 二、Cols,Rows 和 Width,Hight 三、导入\导出到内存中其他结构 四、按矩形 在Mat之间复制 总结 一、OpenCV主要结构 Mat Mat是OpenCV中的主要结构. 主要有两个用途. 1 存储图片信息,2 存…...
Session与Cookie的区别(四)
咖啡寄杯的烦恼 虽然店里生意还可以,但小明无时无刻不想着怎么样发大财赚大钱,让店里的生意变得更好。 他观察到最近好多便利商店开始卖起了咖啡,而且时不时就买一送一或是第二件半价,并且贴心地提供了寄杯的服务。 寄杯就是指说你…...
Linux 文件锁 - fcntl
什么是文件锁? 即锁住文件,不让其他程序对文件做修改! 为什么要锁住文件? 案例,有两个程序,都对一个文件做写入操作。 #include <unistd.h> #include <stdio.h> #include <stdlib.h> …...
CellularAutomata元胞向量机-2-初等元胞自动机MATLAB代码分享
%% 二维元胞自动机%imagesc(a)的色度矩阵a中0->256由蓝变黄% 规则,先把中间点置为1,每一时间每一点如果%周围八个点和为偶数,则变为0,为奇数则变为 1% 颜色控制clc, clearMap [1 1 1; 0 0 0];% [0 0 0] is black, [1 1 1] is …...
OpenStack云平台搭建(6) | 部署Neutron
目录 1.在控制节点登录数据库配置 2.要创建服务证书,完成这些步骤 3.创建网络服务API端点: 4.安装网络组件 5.配置neutron组件 6.配置 Modular Layer 2 (ML2) 插件 7.配置Linuxbridge代理 8.配置DHCP代理 9.配置元数据代理 10.编辑/etc/nova/no…...
Lesson 05.Configuring the Oracle Network Environment
Lesson 05. Configuring the Oracle Network Environment 文章目录Lesson 05. Configuring the Oracle Network Environment1. 监听程序的配置文件有哪些,如何命名,保存在什么位置?2. Oracle 网络的服务名称文件是如何命名的,需要…...
理论五:接口vs抽象类的区别,如何用普通的类模拟抽象类和接口
在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模…...
【Hello Linux】 Linux的权限以及Shell原理
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的基础命令 Linux的权限以及Shell原理Shell的运行原理权限Linux中权限的概念如何切换用户如何提升当前操作的权限如何添加信任…...
【STM32】【HAL库】遥控关灯2 分机
相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 接收RF433和红外信号,根据信号内容控制舵机 硬件设计 主控采用stm32F103c6 STM32 433接收 其他接口 软件设计 接…...
代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II
93.复原IP地址 看完题后的思路 典型分割问题略lue略剪枝条件 sub: 1) 不是一位首字母为0 2)大于三位 3)介于0-255之间 4) 当已分割得到3个时,第四个直接从startIndex到末尾就行 代码 ArrayList<String> slist…...
Unity UI合批的问题
今天看到一个问题,主要说的是Unity中的UI资源合批的问题之前一直以为主要和UI资源在Hierarchy中的排列顺序有关,但其实这并不是最主要的,因为Unity会对同一个Canvas下的UI进行排序(注:不同Canvas下的资源是不能够合批的…...
MWORKS--系统建模与仿真
MWORKS--系统建模与仿真1 系统定义特征2 系统研究2.1 特点与原则2.2 方法百度百科归纳同元杠归纳3 系统建模与仿真3.1 系统、模型、仿真的关系3.2 系统建模4 建模方法4.1 方法4.2 一般流程4.3 目的5 仿真方法5.1 方法5.2 流程参考1 系统定义 系统是由相互作用相互依赖的若干组…...
PC端开发GUI
PC端开发GUI 一、搭建PC端环境:常规方式1、Python2、Pycharm二、搭建PC端环境:创建虚拟环境1、创建文件夹存放虚拟环境相关2、配置环境变量3、创建.ui文件4、.ui文件转成.py文件5、打包.py文件来发布.exe一、搭建PC端环境:常规方式 1、Python 注意Python版本不能超过3.9,…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
