动态规划题目练习

基础知识:

动态规划背包问题-CSDN博客

动态规划基础概念-CSDN博客

题目练习:

 题目1:过河卒

题目描述

棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,A 点 (0,0)、B 点 (n,m),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式

一行四个正整数,分别表示 B 点坐标和马的坐标。

输出格式

一个整数,表示所有的路径条数。

输入输出样例

输入 #1复制

6 6 3 3

输出 #1复制

6

说明/提示

对于 100% 的数据,1≤n,m≤20,0≤马的坐标≤20。

【题目来源】

NOIP 2002 普及组第四题

代码加注释:

#include<stdio.h>  
#include<string.h>  
  
// 定义一个二维数组dp,用于存储到达每个位置的不同路径数  
long long int dp[100][100];  
// 定义一个二维数组s,用于标记障碍物位置  
bool s[100][100];  
  
int main() {  
	// 初始化dp数组为0  
	memset(dp, 0, sizeof(dp));  
	  
	int x, y, x1, y1;  
	// 输入起始点和终点坐标  
	scanf("%d%d%d%d", &x, &y, &x1, &y1);  
	  
	// 将坐标值加2,这样坐标(1,1)在数组中的位置就是(3,3),以便在数组边界外有空间  
	x += 2, y += 2, x1 += 2, y1 += 2;  
	  
	// 定义八个方向的偏移量,用于标记障碍物周围的位置  
	int next[8][2] = { {1,2},{1,-2},{2,1},{2,-1},{-1,-2},{-2,-1},{-1,2},{-2,1} };  
	  
	// 将终点标记为障碍物  
	s[x1][y1] = 1;  
	  
	// 将终点周围八个方向的位置也标记为障碍物  
	for (int i = 0; i < 8; i++) {  
		s[x1 + next[i][0]][y1 + next[i][1]] = 1;  
	}  
	  
	// 初始化起点位置到起点的路径数为1  
	dp[2][1] = 1;  
	  
	// 动态规划计算到达每个位置的不同路径数  
	for (int i = 2; i <= x; i++) {  
		for (int j = 2; j <= y; j++) {  
			// 如果当前位置是障碍物,则跳过  
			if (s[i][j]) continue;  
			// 当前位置的不同路径数等于它左边和上边位置的不同路径数之和  
			dp[i][j] = dp[i][j - 1] + dp[i - 1][j];  
		}  
	}  
	  
	// 输出从起点到终点的不同路径数  
	printf("%lld", dp[x][y]);  
  
	return 0;  
}
//注意:

//代码中使用x += 2, y += 2, x1 += 2, y1 += 2是为了让实际坐标映射到数组dp和s时留有边界空间,
//防止数组越界。
//dp[i][j]保存的是到达位置(i, j)的不同路径数。
//s[i][j]用于标记障碍物位置,其中true表示是障碍物,false表示不是障碍物。
//动态规划过程中,通过累加左边和上边位置的路径数来更新当前位置的路径数。

 题目2:装箱问题

题目描述

有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积。

现在从 n 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。

输入格式

第一行共一个整数 V,表示箱子容量。

第二行共一个整数 n,表示物品总数。

接下来 n 行,每行有一个正整数,表示第 i 个物品的体积。

输出格式

共一行一个整数,表示箱子最小剩余空间。

输入输出样例

输入 #1复制

24
6
8
3
12
7
9
7

输出 #1复制

0

说明/提示

对于 100%100% 数据,满足0<n≤301≤V≤20000。

【题目来源】

NOIP 2001 普及组第四题

代码加解析:

#include<stdio.h>  // 引入标准输入输出库  
#include<iostream> // 引入输入输出流库,但实际上代码中并未使用iostream的功能  
using namespace std; // 使用标准命名空间  
  
int a[100]; // 定义一个整型数组a,用于存储n个物品的价值  
int dp[20100]; // 定义一个整型数组dp,用于存储容量为j时的最大价值  
  
int main()  
{  
    int V, n; // 定义两个整型变量V和n,分别表示背包的总容量和物品的数量  
    scanf("%d%d", &V, &n); // 输入背包的总容量V和物品的数量n  
  
    for (int i = 1; i <= n; i++) {  
        scanf("%d", &a[i]); // 输入每个物品的价值,并存储在数组a中  
    }  
  
    dp[0] = 0; // 初始化dp数组,当容量为0时,最大价值为0  
  
    // 动态规划的主体部分  
    for (int i = 1; i <= n; i++) { // 遍历每个物品  
        for (int j = V; j >= a[i]; j--) { // 遍历背包的每个可能容量,从大到小遍历是为了保证每个物品只被选取一次  
            dp[j] = max(dp[j], dp[j - a[i]] + a[i]); // 更新dp数组,如果当前物品能放入背包并且加上当前物品后的总价值更大,则更新dp[j]  
        }  
    }  
  
    printf("%d", V - dp[V]); // 输出剩余容量,即总容量V减去最大价值dp[V],即表示背包装不下的物品总价值  
  
    return 0; // 主函数返回0,表示程序正常结束  
}

 题目3:小A点菜

题目背景

uim 神犇拿到了 uoi 的 ra(镭牌)后,立刻拉着基友小 A 到了一家……餐馆,很低端的那种。

uim 指着墙上的价目表(太低级了没有菜单),说:“随便点”。

题目描述

不过 uim 由于买了一些书,口袋里只剩 M 元 (M≤10000)。

餐馆虽低端,但是菜品种类不少,有 N 种 ((N≤100),第 i 种卖 ai​ 元 (ai​≤1000)。由于是很低端的餐馆,所以每种菜只有一份。

小 A 奉行“不把钱吃光不罢休”,所以他点单一定刚好把 uim 身上所有钱花完。他想知道有多少种点菜方法。

由于小 A 肚子太饿,所以最多只能等待 11 秒。

输入格式

第一行是两个数字,表示 N 和 M。

第二行起 N 个正数 ai​(可以有相同的数字,每个数字均在 10001000 以内)。

输出格式

一个正整数,表示点菜方案数,保证答案的范围在 int 之内。

输入输出样例

输入 #1复制

4 4
1 1 2 2

输出 #1复制

3

说明/提示

2020.8.29,增添一组 hack 数据 by @yummy

代码加详细解析:

#include<stdio.h>  
  
// 定义两个数组,a用于存储菜品的价格,dp用于存储动态规划的状态  
int a[200];  
int dp[200][10000];  
  
int main()  
{  
	int n, m;  
	scanf("%d%d", &n, &m); // 输入菜品的种类数n和拥有的钱数m  
  
	// 读取每种菜品的价格  
	for (int i = 1; i <= n; i++) {  
		scanf("%d", &a[i]);  
	}  
  
	// 初始化dp数组,dp[0][0]表示没有菜品可选且钱数为0时的方法数为1(不选任何菜品)  
	dp[0][0] = 1;  
  
	// 动态规划的主体部分  
	for (int i = 1; i <= n; i++) { // 遍历每种菜品  
		for (int j = 0; j <= m; j++) { // 遍历当前拥有的钱数  
			// 如果当前钱数大于菜品价格  
			if (j >= a[i]) {  
				// 则可以选择购买当前菜品,方法数等于不购买当前菜品的方法数加上购买当前菜品后剩余钱数的方法数  
				dp[i][j] = dp[i - 1][j] + dp[i - 1][j - a[i]];  
			} else {  
				// 如果当前钱数小于菜品价格,则不能购买当前菜品,方法数等于不购买当前菜品的方法数  
				dp[i][j] = dp[i - 1][j];  
			}  
		}  
	}  
  
	// 输出在拥有m元钱时,可以选择的菜品组合方法数  
	printf("%d", dp[n][m]);  
  
	return 0;  
}

题目会隔几天更新一次,一直到对这个知识点熟练为止。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

由浅到深认识C语言(14):枚举

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

报数游戏-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第39讲。 报数游戏&#xf…

企业开展开源安全治理必要性及可行性详细分析

背景 开源软件安全威胁是近几年企业安全面临的主要威胁&#xff0c;也是企业应用安全方向讨论的热门话题&#xff0c;但是由于是新的需求新的方向&#xff0c;很多企业在观望&#xff0c;当前开展这项工作是否已经成熟&#xff0c;项目成功率如何&#xff1f; 当新鲜事物产生时…

#Linux(第一个Hello World以及GCC基本用法)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;gcc简介&#xff1a;GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由GNU开发的编程语言编译器。GNU编译…

TikTok账号用什么IP代理比较好?

对于运营TikTok的从业者来说&#xff0c;IP的重要性自然不言而喻。 在其他条件都正常的情况下&#xff0c;拥有一个稳定&#xff0c;纯净的IP&#xff0c;你的视频起始播放量很可能比别人高出不少&#xff0c;而劣质的IP轻则会限流&#xff0c;重则会封号。那么&#xff0c;如何…

PTA-练习5

目录 实验7-2-1 求矩阵各行元素之和 实验7-2-2 矩阵运算 实验7-2-3 求矩阵的局部极大值 实验7-2-5 判断上三角矩阵 实验7-2-6 打印杨辉三角 实验7-2-7 方阵循环右移 实验7-2-8 找鞍点 实验7-2-1 求矩阵各行元素之和 #include<stdio.h> #include<stdlib.h> …

python毕业设计基于flask应急救援调度系统django

此系统设计主要采用的是python语言来进行开发&#xff0c;采用flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安全…

mysql数据库迁移注意事项

mysql 数据库迁移注意事项 1 数据库版本一致 SELECT version 2 数据库设置的默认字符一致 [mysqld] character-set-serverutf8mb4 SHOW VARIABLES LIKE %char%; 3 确保数据库设置的时区一致 my.cnf配置文件&#xff1a; [mysqld] DEFAULT-TIME-zone08:00 SHOW VARIABLES…

CSAPP | Lab1-Data Lab 详细解析

You may assume that your machine:1. Uses 2s complement, 32-bit representations of integers.2. Performs right shifts arithmetically.3. Has unpredictable behavior when shifting if the shift amountis less than 0 or greater than 31.Part1&#xff1a;整数 1.Bit…

python语言介绍

一、python基础语法 1、字面量 在代码中&#xff0c;被写下来的固定的值&#xff08;数据&#xff09;&#xff0c;叫做字面量 "abcd" 1 3.6 字面量类型 2、基础python语句 首先&#xff0c;python语句不需要以分号结尾&#xff0c;而是以每一行作为区分&#x…

Springboot整合Mybatis的详细案例+图解+分析(一)

后台访问流程 请求&#xff1a;用户从页面前端&#xff0c;也就是我们所说的view层进行查询访问&#xff0c;进入到controller层找到对应的接口&#xff0c;接着controller层进行对service层进行业务功能的调用&#xff0c;service要进入dao(mapper)层&#xff0c;dao层调用map…

【C++庖丁解牛】stack的介绍和使用 | queue的介绍和使用 | priority_queue的介绍和使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. stack的介绍和使用1.1…

面试算法-68-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视…

【QT入门】 Qt槽函数五种常用写法介绍

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】实现一个简单的图片查看软件-CSDN博客 【QT入门】图片查看软件(优化)-CSDN博客 【QT入门】 lambda表达式(函数)详解-CSDN…

一篇文章教会你如何用 Axure 画原型图

原型图对于做出更好的 UI 设计决策非常重要。然而&#xff0c;选择合适的原型工具并不容易。我们需要仔细考虑成本、功能、与其他设计工具的集成、学习曲线、协作功能和用户测试方法&#xff0c;本文将分析 Axure 的原型设计工具。 1、为何使用 Axure 绘制原型图&#xff1f; …

绝了!这个国标证书的含金量怎么又提高了?!

在项目管理领域&#xff0c;很多人只知道PMP证书&#xff0c;但却不知CSPM认证体系同样正在逐步深入该领域&#xff0c;其价值和影响力让人难以忽视。 一、“CSPM”正式成为注册商标 上周&#xff0c;项目管理标准化官方发布推文&#xff0c;祝贺"CSPM"正式成为项目…

MQTT和Modbus的物联网网关协议区别分析

MQTT和Modbus的物联网网关协议区别分析 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;与Modbus是两种广泛应用在物联网环境中的通信协议&#xff0c;它们各自具有独特的优势和适用场景&#xff0c;下面将从多个维度对这两种网关协议进行详细区别分析。 首…

【MySQL】DDL的表操作详解:创建&查询&修改&删除(记得3点加上连接)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

如何使用Net2FTP+cpolar搭建专属文件共享站点并实现无公网IP远程访问——“cpolar内网穿透”

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

MySQL 索引的10 个核心要点

文章目录 &#x1f349;1. 索引底层采用什么数据结构&#xff1f;为什么不用hash&#x1f349;2. B树与B树区别&#xff1f;为何用B树&#xff1f;&#x1f349;3. 自增主键理解&#xff1f;&#x1f349;4. 为什么自增主键不连续&#x1f349;5. Innodb为什么推荐用自增ID&…