DP类型题目实战

简介: DP类型题目实战

1:0-1背包

给定n(n<=100)种物品和一个背包。物品i的重量是wi(wi<=100),价值为vi(vi<=100),背包的容量为C(C<=1000)。

应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。


输入格式:

共有n+1行输入:

第一行为n值和c值,表示n件物品和背包容量c;

接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。


输出格式:

输出装入背包中物品的最大总价值。

输入样例:

在这里给出一组输入。例如:

5 10
2 6
2 3
6 5
5 4
4 6


输出样例:

在这里给出相应的输出。例如:

15
#include <iostream>
using namespace std;
const int N = 1010;
int n, m;
int f[N];
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
    {
        int v, w;
        cin >> v >> w;
        for (int j = m; j >= v; j -- )
            f[j] = max(f[j], f[j - v] + w);
    }
    cout << f[m];
    return 0;
}


2:01背包

事情是这样的,jzk要去爬山,但是他的包容量有限,可是他需要非常多的能量,要不然就很容易饿。

第一行给出jzk准备爬几次山。

每次爬山都会带新的包(因为jzk每用一个包都会被zwg抢过去),和准备新的食物(因为每次剩下来的都被zwg吃了)。

下一行给你这一次食物的数目n,和背包容量k,

接下来的一行给出n个食物的能量,再一行给出n个食物的大小(占背包的容量)。

请帮助jzk计算他最多可以带多少能量的食物去爬山。输出可以携带食物的最大能量和。

(n,m<1000) 能量和食物均小于40000


输入格式:

第一行包含整数T,表示有T组案例。

接着是T组案例,每组案例三行,第一行包含两个整数N,M,(N<=1000,M<=1000),表示物品数量和袋子的体积。第二行包含表示每个物品能量的n个整数。第三行包含代表每个物品体积的n个整数。


输出格式:

每组案例一行,只输出一个数字,表示jzk可以获得的最大能量。


输入样例:

在这里给出一组输入。例如:

1
5 10
1 2 3 4 5
5 4 3 2 1


输出样例:

在这里给出相应的输出。例如:

14


TIPS:

(包容量是10)可以带第2,3,4,5,个食物,2 + 3 +4 +5 = 14

#include <iostream>
#include <cstring>
using namespace std;
const int N = 40010;
int n, m;
int f[N], w[N], v[N];
int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        memset(f, 0, sizeof f);  // 初始化
        cin >> n >> m;
        for (int i = 0; i < n; i ++ ) cin >> w[i];
        for (int i = 0; i < n; i ++ ) cin >> v[i];
        for (int i = 0; i < n; i ++ )
        {
            for (int j = m; j >= v[i]; j -- )
                f[j] = max(f[j], f[j - v[i]] + w[i]);
        }
        cout << f[m] << endl;;
    }
    return 0;
}


3:最短路径条数(线性DP)

作者 夏仁强

单位 贵州工程应用技术学院


在一个m行n列的网格中,每个网格的各边的长度均相等,求由A(x1,y1)点到达B(x2,y2)点的最短路径条数,其中1<=m,n<=30。输入保证x2>=x1,y2>=y1

如有下图网格,起点和终点分别是A(1,1),B(2,3)


则最短路线是:

(1,1)->(1,2)->(1,3)->(2,3)
   (1,1)->(2,1)->(2,2)->(2,3)
   (1,1(->(1,2)->(2,2)->(2,3)


共3条最短路线

1cdcd6ce171b49a38fe03fd52b23261f.png


输入格式:

第一行输入网格的行数m和列数n

第二行输入A点的坐标

第三行输入B点的坐标


输出格式:

输出一个整数,表示从A点到达B点的最短路线条数


输入样例1:

6 7
1 1
2 3


输出样例1:

3


输入样例2:

30 30
1 1
30 30


输出样例2:

51542064


代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


解析:

f413fecace404ca283c9add04575ad0c.png


4:一步两步(线性DP)

作者 张洪旗

单位 海南师范大学


你要过河,但是没有桥,只有由一排石头堆成的石头路,你一次只能跨一个石头或者两个石头,求你到第n个石头有多少种走法。


输入格式:

正整数n


输出格式:

可能性的个数


输入样例1:

在这里给出一组输入。例如:

1


输出样例1:

在这里给出相应的输出。例如:

1


输入样例2:

在这里给出一组输入。例如:

2


输出样例2:

在这里给出相应的输出。例如:

2


输入样例1:

在这里给出一组输入。例如:

8


输出样例1:

在这里给出相应的输出。例如:

34

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


#include <iostream>
using namespace std;
const int N = 1010;
int f[N];
int main()
{
    f[1] = 1; f[2] = 2;
    int n;
    cin >> n;
    for (int i = 3; i <= n; i ++ )
        f[i] = f[i - 1] + f[i - 2];
    cout << f[n];
    return 0;
}


5:青蛙跳台阶

作者 房正华

单位 青岛工学院


一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。

输入格式:

首先输入数字n,代表接下来有n组输入,50>=n>=0,然后每行一个数字,代表台阶数,数字为小于60的整数

输出格式:

对每一组输入,输出青蛙的跳法。


输入样例:

3
1
2
3


输出样例:

1
2
3


代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


#include <iostream>
using namespace std;
const int N = 50;
int f[N];
int main()
{
    f[1] = 1; f[2] = 2;
    for (int i = 3; i <= 50; i ++ ) //  预处理
        f[i] = f[i - 1] + f[i - 2];
    int n;
    cin >> n;
    while (n -- )
    {
        int x;
        cin >> x;
        cout << f[x] << endl;
    }
    return 0;
}


6:数字三角形问题

作者 夏仁强

单位 贵州工程应用技术学院

给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

4e55571e9ab94917b4f6c14ac6e12c9a.png

对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。


输入格式:

输入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0…99之间。


输出格式:

输出数据只有一个整数,表示计算出的最大值。


输入样例:

在这里给出一组输入。例如:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5


输出样例:

在这里给出相应的输出。例如:

30

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB


#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
int a[N][N], f[N][N];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= i; j ++ )
            cin >> a[i][j];
    for (int i = 1; i <= n; i ++ ) f[n][i] = a[n][i];
    for (int i = n - 1; i >= 1; i -- )
        for (int j = 1; j <= i; j ++ )
            f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
    cout << f[1][1];
    return 0;
}


目录
相关文章
基于SpringBoot+Vue的餐饮管理系统设计与实现
基于SpringBoot+Vue的餐饮管理系统设计与实现
273 0
|
开发工具 git Windows
VSCode下载与安装使用教程【超详细讲解】
VSCode下载与安装使用教程【超详细讲解】
4410 0
VSCode下载与安装使用教程【超详细讲解】
|
11月前
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
220 8
Leetcode第45题(跳跃游戏II)
|
安全 数据中心
HTTP静态、动态住宅ip代理和数据中心代理是什么?有什么区别?
HTTP静态、动态住宅ip代理和数据中心代理是什么?有什么区别?
HTTP静态、动态住宅ip代理和数据中心代理是什么?有什么区别?
|
移动开发 运维 算法
室内电子地图制作:位构云平台,快速构建轻量级多类型地图
在数字化时代,室内导航和空间信息管理变得日益重要。位构云平台以其强大的功能和用户友好的界面,为用户提供了一个全面的解决方案,轻松构建多平台、综合型地图引擎,满足从商场到校园等各种场景的需求。
335 1
|
11月前
|
弹性计算 应用服务中间件 网络安全
ECS服务器使用:SSL证书安装、配置和问题定位指南
本文简要介绍了SSL证书的生成与部署方法,包括使用OpenSSL生成自签名证书和从CA获取证书的步骤,以及在Apache和Nginx服务器上的配置方法。此外,还提供了测试证书是否生效的方法和常见问题的解决策略,帮助确保证书正确安装并解决调试过程中可能遇到的问题。
991 0
|
SQL 关系型数据库 MySQL
MySQL实现并发控制的过程
数据库系统到底是怎么进行并发访问控制的?本文以 MySQL 8.0.35 代码为例,尝试对 MySQL 中的并发访问控制进行整体介绍。
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解08-阻塞队列之LinkedBlockingDeque
**摘要:** 本文分析了Java中的LinkedBlockingDeque,它是一个基于链表实现的双端阻塞队列,具有并发安全性。LinkedBlockingDeque可以作为有界队列使用,容量由构造函数指定,默认为Integer.MAX_VALUE。队列操作包括在头部和尾部的插入与删除,这些操作由锁和Condition来保证线程安全。例如,`linkFirst()`和`linkLast()`用于在队首和队尾插入元素,而`unlinkFirst()`和`unlinkLast()`则用于删除首尾元素。队列的插入和删除方法根据队列是否满或空,可能会阻塞或唤醒等待的线程,这些操作通过`notFul
383 5
|
存储 Java API
嵌入式工程师如何写好技术文档
嵌入式工程师如何写好技术文档
399 1
|
搜索推荐 数据可视化 关系型数据库
OneCode 低代码平台 AIGC快速构建无代码应用
OneCode是一款基于DDD模型驱动设计的低代码引擎。从2022年底推出以来,现在的最新版本是1.1.0。本文重点是采用OneCode提供的工具来实际搭建一个简单的(员工请销假)业务应用。在搭建过程中穿插讲解一些功能设计思想以及使用方法。