蓝桥杯(跳跃)问题
题目描述
题目要求
代码样式
博主的话(可省略)
博主在某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;
}