C++:背包问题习题

ops/2025/3/26 0:53:38/

1. 货币系统

1371. 货币系统 - AcWing题库

给定 V 种货币(单位:元),每种货币使用的次数不限。

不同种类的货币,面值可能是相同的。

现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。

解题思路

我们两层循环分别枚举到第i种物品了,价值为j

如果枚举的价值大于当前枚举物品的价值就将f[i][j]的值赋为f[i][j-w[i]].这个值记录用w[i]凑到j的方法数量

不选的方法与f[i-1][j]的值相同。即不用w[i]凑到j的方法

AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>using namespace std;int v,n;
long long w[30];
long long f[30][10010];//前i种物品选择价值为j的方案数
int main()
{scanf("%d%d",&v,&n);for(int i=1;i<=v;i++){scanf("%d",&w[i]);}f[0][0]=1;for(int i=1;i<=v;i++){for(int j=0;j<=n;j++){if(j>=w[i])//选了{f[i][j]=f[i][j-w[i]];//凑f[i][j-w[i]](即少选一次w[i]的方法) 有几个方法,就是用w[i] 来凑到j的方法}//没选f[i][j]+=f[i-1][j];//加上没有这个i的方法,即不用w[i]来凑到j的方法}}printf("%lld",f[v][n]);return 0;
}

2. 01背包

2. 01背包问题 - AcWing题库

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

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

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

 解题思路

两层循环分别来枚举,到第i个物品,体积不小于j

如果j小于v[i](v这个数组用来记录i个物品的体积,w数组用来记录价值)那只能不拿,价值就是不选i体积为j的价值

如果不小于就可以选择拿还是不拿,将拿了第i个物品体积才到j与不拿这个物品体积就到j的价值进行比较取较大值

AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int N, V;
int v[1010];
int w[1010];
int f[1010][1010];//前i件物品中,寻找不超过j个体积的最大价值
int main()
{scanf("%d%d", &N, &V);for (int i = 1; i <= N; i++){scanf("%d%d", &v[i], &w[i]);}for(int i=1;i<=N;i++)//前{for(int j=0;j<=V;j++)//体积{if(j<v[i])//不能拿{f[i][j]=f[i-1][j];//与没i是一样的,取值为不选第i件物品体积为j的最大价值}else//可以拿{f[i][j]=max(f[i-1][j-v[i]]+w[i],f[i-1][j]);//比较不拿第i件物品体积达到j与拿了第i件物品体积达到j谁更大}}}printf("%d\n", f[N][V]);return 0;
}

 3. 完全背包

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

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

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

解题思路

与01背包不同的是完全背包的每一种都可以无限选择,所以它选择第i个不用使i-1后再统计j-v[i],因为之前可能使用过i了没使用(或使用了不如不用)那f[i][j-v[i]]也在之前初始化为了f[i-1][j-v[i]]

AC代码
#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;int N,V;
int v[1010];
int w[1010];int f[1010][1010];int main()
{scanf("%d%d",&N,&V);for(int i=1;i<=N;i++){scanf("%d %d",&v[i],&w[i]);}for(int i=1;i<=N;i++)//枚举第i件物品{for(int j=0;j<=V;j++){if(j<v[i])//不能放{f[i][j]=f[i-1][j];//统计没放的}else//能放f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);//没放这一次的价值,即选了k-1次i物品的价值}}cout<<f[N][V]<<endl;return 0;
}

4. 砝码称重

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WNW1,W2,···,WN。

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

 解题思路

两层循环,枚举第i个砝码,能否凑成j的重量,存储值为布尔类型

一个砝码有三种情况,放在天平右边(看当前重量减去这个砝码重量是否能凑成(取绝对值,因为这边超过另一半,超过的重量也成立)),放在左边(同上不过是加上)与不放(看上一个可不可以即可),只要有一种可以就能凑成。

将0个砝码,0重量初始化为true,但最后累计时不能算上,因为只统计正整数,0不是

 AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>using namespace std;int N;
int v[110];bool f[110][200010];int main()
{scanf("%d",&N);int sum=0;for(int i=1;i<=N;i++){scanf("%d",&v[i]);sum+=v[i];}f[0][0]=true;//0肯定能凑出来,什么也不放就行for(int i=1;i<=N;i++)//第i个{for(int j=0;j<=sum;j++)//凑j的重量,能否凑成{//1如果不放就能达到j这个重量那肯定可以,2如果放到左边看不放之前有没有这个重量f[i][j]=f[i-1][j]|f[i-1][j+v[i]]|f[i-1][abs(j-v[i])];//不放和放左边和放右边}}int res=0;for(int i=1;i<=sum;i++)//i不能从0开始因为0不是正整数{if(f[N][i])res++;}printf("%d",res);return 0;
}

这篇就到这里啦(づ ̄3 ̄)づ╭❤  ~(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤


http://www.ppmy.cn/ops/169795.html

相关文章

Python----计算机视觉处理(Opencv:绘制图像轮廓:寻找轮廓,findContours()函数)

一、轮廓 轮廓是图像中目标物体或区域的外部边界线或边界区域&#xff0c;由一系列相连的像素构成封闭形状&#xff0c;代表了物体的基本外形。与边缘不同&#xff0c;轮廓是连续的&#xff0c;而边缘则不一定是连续的。 轮廓与边缘的区别&#xff1a; 轮廓是一组连续的点或线…

Android Compose 基础布局之 Box 和 Stack 源码深度剖析(九)

Android Compose 基础布局之 Box 和 Stack 源码深度剖析 一、引言 1.1 Android 开发中布局的重要性 在 Android 应用开发里&#xff0c;布局是构建用户界面&#xff08;UI&#xff09;的关键环节。良好的布局设计能够提升用户体验&#xff0c;使应用界面更加美观、易用且具有…

蓝桥备赛(24)算法篇【前缀和】

一、前缀和 前缀和与差分的核心思想是 预处理 &#xff0c; 可以再暴力枚举的过程中 &#xff0c; 快速给出查询结果 &#xff0c; 从而优化时间复杂度。 是经典的用空间替换时间的做法 。 二、 一维前缀和 登录—专业IT笔试面试备考平台_牛客网 注意&#xff1a; 使用前缀和…

Qt的内存管理机制

在Qt中&#xff0c;显式使用new创建的对象通常不需要显式调用delete来释放内存&#xff0c;这是因为Qt提供了一种基于对象树(Object Tree)和父子关系(Parent-Child Relationship)的内存管理机制。这种机制可以自动管理对象的生命周期&#xff0c;确保在适当的时候释放内存&…

网络知识编-数据链路层(以太网 局域网通信 ARP协议 ARP 欺骗 DDos 攻击)

一、认识数据链路层 数据链路层位于物理层和网络层之间&#xff0c;其主要作用是将源自物理层的数据可靠地传输到相邻节点的目标主机的网络层。数据链路层通过物理介质&#xff08;如以太网、Wi-Fi等&#xff09;将数据分割成帧&#xff0c;并在相邻节点之间进行传输。其主要功…

从技术架构和生态考虑,不是单纯的配置优化,还有哪些方式可以提高spark的计算性能

从技术架构和生态系统层面提升Spark的计算性能&#xff0c;可采取以下核心策略&#xff1a; 一、计算模型重构与执行引擎升级 1. 弹性分布式数据集&#xff08;RDD&#xff09;的血统优化 通过RDD的Lineage&#xff08;血统&#xff09;机制实现容错时&#xff0c;采用增量式…

mysql数据实时全量+增量迁移

对mysql数据库实时全量增量迁移 在数据库管理中&#xff0c;实时全量增量迁移是一种常见的需求&#xff0c;特别是在数据库维护、备份恢复、数据迁移或数据同步等场景中。MySQL数据库提供了多种工具和方法来实现这一需求。以下是几种常见的方法来实现MySQL数据库的实时全量增量…

阿里qwen大模型AI智能分析实时对话生成病例的DEMO

Qwen大模型根据医患对话录音生成病例 业务背景涉及前端技术涉及后端技术阿里云文档完整代码&#xff08;复制即可运行&#xff09; 业务背景 在HIS或者其他医疗系统中&#xff0c;为了提高医生的现场或者线上问诊工作效率&#xff0c;在系统的开病例这块可以通过对话录音&…