蛮力法解决01背包问题(递归)

news/2025/3/14 18:24:09/

实验项目1     蛮力法

 [实验题目]

使用蛮力法解决0/1背包问题

问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。

示例:

背包容量C=15kg

物品1:重量2kg,价值2$

物品2:重量12kg,价值4$

物品3:重量1kg,价值2$

物品4:重量1kg,价值1$

物品5:重量4kg,价值10$

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int f[N][N];//f数组表示前i个物品体积小于等于j的最大价值
int w[N],v[N];//w表示价值,v表示体积
int main()
{int m,n;cin>>n>>m;for(int i=1;i<=n;i++)cin>>v[i]>>w[i];f[0][0]=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){f[i][j]=f[i-1][j];//不选第i个物品if(j>=v[i])//选第i个物品,此时注意前i-1个物品体积满足大于等于0{f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);//取选与不选的价值最大值}}}cout<<f[n][m]<<endl;return 0;
}

实验学时:2学时

实验目的

(1)理解算法的时间复杂度;

(2)熟练设计和生成问题的解空间:设计一种穷举策略将物品装入背包的各种装法都找出来,并能够在计算机中存储和表示。

(3)理解蛮力法的局限性;

实验要求

  1. 掌握用递归或循环生成n个元素的全部子集的算法设计方法;

(2)按上图示例数据求解出问题的一个最优解:装入哪几个物品价值最大,总重量和总价值各是多少?

(3)按算法设计过程完成本实验:

  1. 首先运用计算机的IPO模型理解和分析问题,确定算法的输入数据和输出数据及其数据结构。
  2. 编写算法时按照“自顶向下,逐步求精”的原则,先描述算法的主干逻辑步骤,再对每个步骤进一步细化。
  3. 将算法转换成程序时,注意运用模块化程序设计方法,将算法封装成1个或多个模块(函数或对象)。
  4. 最后运行程序并验证分析运行结果。

注意:对递归算法不熟悉的学生,可以先做一个练习:设计一个递归函数,实现计算N的阶乘。N!=N(N-1)!

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
int v[N],w[N];
int weight;
int n;
int recursion(int weight,int i)//当前背包可以承受的重量和物品个数 
{int ans=0;if(i==n)ans=0;else if(w[i]>weight)//所选物品大于当前背包可以承受的重量,略过 {ans=recursion(weight,i+1);//换到下一个 }else{//选与不选//判断哪个价值更大,选择价值更大的 (在选当前物品和不选当前物品中判断) int ans1=v[i]+recursion(weight-w[i],i+1);int ans2=recursion(weight,i+1);ans=max(ans1,ans2);}return ans;//返回价值 
}
int main()
{cin>>weight>>n;//输入背包承受的最大重量 for(int i=0;i<n;i++)cin>>w[i]>>v[i];//输入每个背包的价值和重量cout<<recursion(weight,0)<<endl;//最终最大的价值 
}


http://www.ppmy.cn/news/1182170.html

相关文章

智慧工地管理系统源码-数字孪生智慧工地可视化解决方案

一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段&#xff0c;进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加&#xff0c;施工现场管理的内容越来越多&#xff0c;管理的技术难度和要求在不断提高。传统的施工现场管理模…

凡人修仙传之工作试用期篇

一、宗门挑选&#xff08;试岗&#xff09; 入职首先问你的直系领导有没有试岗期&#xff0c;HR很可能不给你说的&#xff0c;有的话又是几天&#xff0c;试岗通过标准是啥&#xff0c;另外多久转正&#xff0c;转正的考核标准是什么&#xff1f; 这个时候一定要有录音&#x…

nginx通过配置文件来进行的安全方面优化

目录 1、隐藏版本号 2、配置错误页面重定向 3、添加header防止XSS攻击 4、利用referer图片防盗链 5、拒绝某些user-agent 6、限制HTTP请求方法 7、nginx开启https 8、控制迸发连接数 1、隐藏版本号 说明&#xff1a; 由于某些 Nginx 漏洞只存在于特定的版本&#xff0…

图文并茂的帮助文档你值得拥有

概述 工作中除了写代码开发需求&#xff0c;也需要写文档&#xff0c;怎么写好一个文档能够让读者既能看懂API&#xff0c;又能快速上述操作&#xff0c;所见即所得。本文基于vitepress、ace-builds带大家实现一个这样好用的帮助文档。 实现效果 在线预览地址&#xff1a;ht…

当线性规划与算法相遇:揭秘单纯形法(Simplex)的独特魅力

传统的解决线性规划问题的方法是图形法、代数法求解&#xff0c;但是图形法解题有极大的局限性&#xff0c;因为一旦变量超过3个&#xff0c;基本上就无法通过图形解决&#xff0c;而代数法虽然可以解题&#xff0c;但对于复杂的问题可能效果较差甚至无法求解&#xff01; 相比…

6、PostgreSQL 数据类型之一:数字类型和货币类型

PostgreSQL 作为一个强大的开源关系型数据库管理系统&#xff0c;本身支持多种数据类型&#xff0c;包括标准 SQL 数据类型以及一些扩展数据类型。 PostgreSQL 支持多种数据类型的设计理念是为了满足不同应用场景的需求&#xff0c;提供更大的灵活性和数据处理能力。原因如下&…

Linux系统编程_网络编程:字节序、socket、serverclient、ftp 云盘

1. 网络编程概述&#xff08;444.1&#xff09; TCP/UDP对比 TCP 面向连接&#xff08;如打电话要先拨号建立连接&#xff09;&#xff1b;UDP 是无连接的&#xff0c;即发送数据之前不需要建立连接TCP 提供可靠的服务。也就是说&#xff0c;通过 TCP 连接传送的数据&#xf…

吉利笔试——编程代码题

Q1: 假设有一个n 行m 列的表格&#xff0c;可以分成n✖️m 个块。 有一根从左上角到右下角的对角线连接&#xff0c;所有接触对角线的表格中的块为白色&#xff0c;也就是对角线会从该表格中的 小块中经过。输入 表格的大小&#xff0c;输出白色块的数量。 一个矩形n行m列&a…