蓝桥杯(跳跃)问题

题目描述

题目要求

代码样式

博主的话(可省略)

博主在某dn上搜索了很多的文章,才理解并且根据思路写出的代码。
这个问题也是背包问题,动态的规划问题------称作背包问题。
博主也是一个小白,第二次接触背包的问题,本篇文章错误之处还请指出

解题思路

例子(直接进入背包问题)

N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
解法:
当我们想要获得第i件物品装进背包的最大价值时。我们只需要确定背包里的i-1个物品达到了最大价值。依次递归向前推导。
而问题是,我们如何判断那个是最优选择。
重点:
当我们要获得最优解时,那么每次获得选择时,都应在本条件下选择最优的那个。所以每次在选择时,我们就要进行对比!

#include<bits/stdc++.h>
using namespace std;
  long long m,n;
  int ans;
  //这里设置的是条件就相当于(x,y)坐标根据题目条件做出的约束,移动的直线距离不能超过3
  //因为每次的搜索都得是和前一个比,并且题目要求坐标要比前一个大,所以y的坐标这样设置
  int x[9] = {0,0,0,-1,-1,-1,-2,-2,-3};
  int y[9] = {-3,-2,-1,-2,-1,0,-1,0,0};
  int dpf[110][110];
int main()
{
  cin >> m >> n;
  for(int i=1;i<=m;i++)
  {
    for(int j=1;j<=n;j++)
    {
      cin >> dpf[i][j];
      //limits.h 这是头文件里的一个符号常量 , 表示计算int的最小值(其实意思就是int的最小值)
	  //很有意思的一个符号变量
      ans  = INT_MIN;
      for(int k = 0;k<9;k++)
      {
        if(i+x[k]>=1 && j+y[k]>=1)
        {
          ans = max(ans,dpf[i+x[k]][j+y[k]]);
        }
      }
	  //这里就类似于一个最优选择的节点,在本次的最优选择下,再次进行递归比较选择最优解
      if(ans!=INT_MIN) dpf[i][j] += ans;
    }
  }
  //输出答案
  cout << dpf[m][n] <<endl;
  return 0;
}
posted @ 2022-02-13 20:38  野生创造侠  阅读(159)  评论(0)    收藏  举报