【算法实验】实验4

实验4-1 01背包

【问题描述】给定一个容量为C的背包,现有n个物品,每个物品的体积分别为s1,s2...sn,价值分别为v1,v2...vn。每个物品只能放入一次。背包最多能装入价值为多少的物品。
【输入形式】输入的第1行包含2个整数C和n,分别表示背包容量和物品个数。接下来n行,每行包含2个整数si和vi,分别表示物品的体积和价值。
【输出形式】输出1行中含有一个数字,表示背包能装入的物品的最大价值。
【样例输入】

9 4

2 3

3 4

4 5

5 7
【样例输出】

12

//实验4-1 01背包
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int dp[N][N];
int v[N];
int w[N];int main()
{int c , n ;cin >> c >> n;for(int i = 1 ; i <= n ; i ++ ){cin >> v[i] >> w[i];} for(int i = 1 ; i <= n ; i ++ ){for(int j = 1 ; j <= c ; j ++ ){dp[i][j] = dp[i-1][j];if( j >= v[i]){dp[i][j] = max(dp[i-1][j] , dp[i-1][j - v[i]] + w[i]);}}}cout << dp[n][c];return 0;} 

实验4-2 所有点对的最短路径问题

【问题描述】给定一个非负的加权有向图G,求其中任意两个节点之间的最短路径。
【输入形式】输入的第1行包含2个整数n和m,表示图G中包含n个节点和m条边。接下来m行,每行中有3个整数i,j,w,表示从节点i到节点j存在一条边(节点编号从1开始),该边的权重为w。
【输出形式】

输出最短路径矩阵,共包含n行,每行包含n个数字(数字之间使用空格分割),表示该节点到其他节点的最短距离。

特别地,节点到自身的距离定义为0;如果节点之间无法到达,使用1e9+7表示他们之间的距离。
【样例输入】

3 5

1 2 2

1 3 9

2 1 8

2 3 6

3 1 1
【样例输出】

0 2 8

7 0 6

1 3 0
【思考】如果出现负边,如何进行改进

floyed

//实验4-1 01背包
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
const int INF = 0x7f7f7f;
int dp[N][N];
int v[N];
int w[N];int main()
{int n , edgenum;cin >> n >> edgenum;int x , y , w ;memset(dp,INF,sizeof dp);for(int i = 1 ; i <= n ; i ++ ){dp[i][i] = 0;}for(int i = 1 ; i <= edgenum ; i ++ ){cin >> x >> y >> w;dp[x][y] = w;}for(int i = 1 ; i <= n ; i ++ ){for(int j = 1; j <= n ; j ++ ){for(int k = 1 ; k <= n ; k ++ ){dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j]); }}}for(int i = 1 ; i <= n ; i ++ ){for(int j = 1 ; j <= n ; j ++ ){cout << dp[i][j]<<" ";} cout <<"\n";}return 0;} 

实验4-3 矩阵链相乘

【问题描述】给定n个矩阵M1,M2...Mn,他们的维数分别是r1*c1,r2*c2...rn*cn,要求使用【动态规划】的策略求解矩阵连乘的最优计算代价(总乘法次数最少)。题目保证矩阵相乘一定是有效的。

例如有三个矩阵M1,M2,M3,他们的维度分别是2*10,10*2,2*10。按照矩阵乘法的结合律,可以先把M1和M2相乘,然后把结果和M3相乘,总的乘法次数为2*10*2+2*2*10=80次;也可以先把M2和M3相乘,再用M1去相乘,这种方式下总的乘法次数为10*2*10+2*10*10=400次。因此最优计算代价为80。
【输入形式】输入的第1行中有1个数字n,表示矩阵的个数;接下来n行,每行2个整数ri和ci,分别表示矩阵Mi的行数和列数。
【输出形式】输出1行中有一个数字,表示n个矩阵相乘的最优计算代价。
【样例输入】

3

2 10

10 2

2 10
【样例输出】

80
【说明】

n>=2

1<=ri,ci<=20

//3
#include <iostream>
using namespace std;
const int N=101;
const int MAXN = 0x3f3f3f3f;
int n,cost;
int row[N], col[N], dp[N][N];
int main()
{cin >> n;for (int i = 1; i <= n; i++) {cin >> row[i] >> col[i];}for (int i = 1; i <= n; i++) {dp[i][i] = 0;}for (int x = 2; x <= n; x++) {for (int i = 1; i <= n - x + 1; i++) {int t = i + x - 1; dp[i][t] = MAXN;for (int k = i; k < t; k++) {cost = dp[i][k] + dp[k + 1][t] + row[i] * col[k] * col[t];if (cost < dp[i][t]) {dp[i][t] = cost;}}}}cout << dp[1][n]<<"\n";
}

实验4-4 最少费用购物——动态规划

问题描述:

  商店中每种商品都有标价。例如,一朵花的价格是2 元。一个花瓶的价格是5 元。为了吸引顾客,商店提供了一组优惠商品价。优惠商品是把一种或多种商品分成一组,并降价销售。例如,3 朵花的价格不是6 元而是5 元。2 个花瓶加1 朵花的优惠价是10 元。试设计一个算法,计算出某一顾客所购商品应付的最少费用。

编程任务:

  对于给定欲购商品的价格和数量,以及优惠商品价,编程计算所购商品应付的最少费用。

数据输入:

  由文件input.txt 提供欲购商品数据。文件的第1 行中有1 个整数B(0≤B≤5),表示所购商品种类数。接下来的B 行,每行有3 个数C,K 和P。C 表示商品的编码(每种商品有唯一编码),1≤C≤999。K 表示购买该种商品总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。请注意,一次最多可购买5*5=25 件商品。

  由文件offer.txt 提供优惠商品价数据。文件的第1 行中有1 个整数S(0≤S≤99),表示共有S 种优惠商品组合。接下来的S 行,每行的第一个数描述优惠商品组合中商品的种类数j。接着是j 个数字对(C,K),其中C 是商品编码,1≤C≤999。K 表示该种商品在此组合中的数量,1≤K≤5。每行最后一个数字P(1≤ P≤9999 )表示此商品组合的优惠价。

结果输出:

  程序运行结束时,将计算出的所购商品应付的最少费用输出到文件output.txt 中。

输入文件示例                            输出文件示例

input.txt         offer.txt              output.txt

2                    2                        14

7 3 2             1 7 3 5

8 2 5             2 7 1 8 2 10

找出问题的规律,设cost(a,b,c,d,e)表示购买商品组合(a,b,c,d,e)需要的最少费用,A[k],B[k],C[k],D[k],E[k]表示第k种优惠方案的商品组合。offer(m)是第m种优惠方案的价格。如果cost(a,b,c,d,e)使用了第m种优惠方案,则找出最优子问题的递归表达式:cost(a,b,c,d,e)=cost(a-A[m],b-B[m],c-C[m],d-D[m],e-E[m])+offer(m)【★动态规划的步骤一★】
即该问题具有最有子结构性质,可以用动态规划算法来实现。
 

#include <iostream>
using namespace std;int sale[10][6] = { 0 };	//分别表示每个优惠中每个商品数量 
int saleprice[10] = { 0 };	//优惠的价格 
int good[6][4] = { 0 };       //id  price  数量 
int dp[6][6][6][6][6]; //存储结果 
int n;//商品数目
int m;//优惠方案数量void input() {cin >> n;for (int i = 1; i <= n; i++) {cin >> good[i][1] >> good[i][3] >> good[i][2];//编号 商品数量 单价 }int salething[10] = { 0 };	//优惠总共有几个商品 int saleid[10][10] = { 0 };	//优惠商品的ID cin >> m;for (int i = 1; i <= m; i++) {cin >> salething[i];//本次优惠有几个商品for (int j = 1; j <= salething[i]; j++) {cin >> saleid[i][j];//商品idcin >> sale[i][saleid[i][j]];//商品的数目}cin >> saleprice[i]; //这种方案优惠价格}
}
int main() {input();//输入自己的要求dp[0][0][0][0][0] = 0;for (int i = 0; i <= good[1][3]; i++)//第几种 数量for (int j = 0; j <= good[2][3]; j++)for (int k = 0; k <= good[3][3]; k++)for (int l = 0; l <= good[4][3]; l++)for (int p = 0; p <= good[5][3]; p++) {//单价int minx = i * good[1][2] + j * good[2][2] + k * good[3][2] + l * good[4][2] + p * good[5][2];//2存的是单价 不存在初始化默认为0 所以计算结果就为零for (int q = 1; q <= m; q++) {//m优惠方案数目 2 if (i - sale[q][good[1][1]] < 0 || j - sale[q][good[2][1]] < 0 || k - sale[3][good[3][1]] < 0 || l - sale[q][good[4][1]] < 0 || p - sale[q][good[5][1]] < 0)continue;//跳过本次方案 商品不够int t = dp[i - sale[q][good[1][1]]][j - sale[q][good[2][1]]][k - sale[q][good[3][1]]][l - sale[q][good[4][1]]][p - sale[q][good[5][1]]] + saleprice[q];if (t < minx) minx = t;}dp[i][j][k][l][p] = minx;//循环存入数据}cout << dp[good[1][3]][good[2][3]][good[3][3]][good[4][3]][good[5][3]] << endl;//输出五维度数组system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++大学教程(第九版)5.18进制表

目录 题目 代码 运行截图 题目 &#xff08;进制表&#xff09;编写一个程序要求打印一张表&#xff0c;内容是1~256范围内每个十进制数对应的二进制、八进制和十六进制形式。如果还不熟悉这些计数系统&#xff0c;可先阅读附录 D。提示:可以使用流操纵符dec、oct 和 hex来…

算法笔记 #3

2024年1月18日 Q1&#xff1a;搜索二叉树 A&#xff1a;查找&#xff0c;左子树比根几点小&#xff0c;右子树比根大。 删除&#xff1a;1&#xff09;搜索删除的目标节点&#xff0c;记录其父节点&#xff1b; 2&#xff09;左右孩子都为空&#xff0c;直接删掉&#xff1b;…

Spring+SpringMVC+Mybatis进行项目的整合

Spring SpringMVCM Mybatis 整合 一、 通过idea创建maven工程 二、 引入依赖项以及导入mybatis逆向工程的插件 将如下的文件替换所在工程的pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4…

实验二 体系结构

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

【Leetcode】277.搜寻名人

一、题目 1、题目描述 假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。 现在你想要确认这个 “名人” 是…

Seaborn可视化的各种图及代码演示

一.简介 Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面&#xff0c;便于用户能够做出各种有吸引力的统计图表。 Seaborn是在matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;在大多数情况下使用seaborn能做…

【Proteus仿真】【51单片机】甲醛浓度检测报警器

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用蜂鸣器LED模块、LCD1602显示模块、按键、MS1100甲醛传感器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示甲醛气体浓度检测值…

图形化编程:开启无代码时代的编程之旅

在当今数字化时代&#xff0c;编程已经成为一项重要的技能。然而&#xff0c;对于许多初学者和非专业人士来说&#xff0c;传统的文本编程语言往往显得复杂和难以理解。图形化编程&#xff0c;作为一种新兴的编程范式&#xff0c;正逐渐改变这一现状&#xff0c;为更多人打开了…

linux 内核ARM64启动

基于linux5.15内核翻译理解 Essentially, the boot loader should provide (as a minimum) the following: Setup and initialise the RAMSetup the device treeDecompress the kernel imageCall the kernel image1、安装与初始化物理内存 (必须的) boot loader需要初始化物理…

RK3568平台开发系列讲解(Linux系统篇)中断下文 tasklet

🚀返回专栏总目录 文章目录 一、什么是 taskle二、tasklet 相关接口函数2.1、静态初始化函数2.2、动态初始化函数2.3、关闭函数2.4、使能函数2.5、调度函数2.6、销毁函数三、测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄

【网站项目】基于springboot与vue的电子商城项目

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

vue生命周期,父子组件生命周期

生命周期 什么是生命周期? 从Vue实例创建、运行、到销毁期间&#xff0c;总是伴随着各种各样的事件&#xff0c;这些事件&#xff0c;统称为生命周期&#xff01; beforeCreate: 初始化之前&#xff0c;data和methods的数据还没有初始化 ⻚面重定向 created&#xff1a;初始化…

ubuntu开放ssh服务

&#x1f4d1;前言 本文主要是【ubuntu】——ubuntu开放ssh服务的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一…

【安装VMware Tools】实现Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件

https://www.bilibili.com/video/BV1rN411277B/?spm_id_from333.788.recommend_more_video.6&vd_sourcefb8dcae0aee3f1aab700c21099045395 https://blog.csdn.net/wxqian25/article/details/19406673 待解决方案&#xff1a; 重新下载ubuntu&#xff0c;然后按照 https://…

01 SpringMVC的快速理解

1.1 如图所示&#xff0c;SpringMVC负责表述层&#xff08;控制层Controller&#xff09;实现简化&#xff01; SpringMVC的作用主要覆盖的是表述层&#xff0c;例如&#xff1a; 请求映射、数据输入、视图界面、请求分发、表单回显、会话控制、过滤拦截、异步交互、文件上传…

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0…

渗透测试之Hydra如何B破远程主机RDP登录M码

环境: Hydra9.3 KALI2022 问题描述: 渗透测试之hydra如何B破远程主机RDP登录M码 解决方案: Hydra是一款非常强大的网络登录P解工具。它专门用于测试和评估网络安全,通过暴力P解方式尝试多种用户名和密码组合,以获得对受测试系统的非法访问。Hydra支持各种协议的登录破…

一款 StarRocks 客户端工具,支持可视化建表、数据编辑

什么是 StarRocks&#xff1f; StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;就可以用 StarRocks 来支持多种数据分析场景的极速分析。 为了…

Oracle行转列函数,列转行函数

Oracle行转列函数&#xff0c;列转行函数 Oracle 可以通过PIVOT,UNPIVOT,分解一行里面的值为多个列,及来合并多个列为一行。 PIVOT PIVOT是用于将行数据转换为列数据的查询操作(类似数据透视表)。通过使用PIVOT&#xff0c;您可以按照特定的列值将数据进行汇总&#xff0c;并将…

vue中父组件异步传值,渲染问题

vue中父组件异步传值&#xff0c;渲染问题 父组件异步传值&#xff0c;子组件渲染不出来。有如下两种解决方法&#xff1a; 1、用v-if解决&#xff0c;当父组件有数据才渲染 <Child v-if"dataList && dataList.length > 0" :data-list"dataLis…