--------滚动数组及动态规划思想--------
滚动数组·减少空间复杂度:在一些题目中,可能需要数组去记录一些过程,但有些时候,我们最后的结果并不需要得到这些中间过程,而是利用这些过程最终得到需要的结果,这是我们就可以利用滚动数组的思想重复利用那些不需要的数组数据,将新的过程数据放到那些数组空间中去。
不恰当演示如下:

动态规划·空间换时间:我的理解为每个阶段的最优状态可以从之前阶段的基础上计算得到,具体可以看大佬们的解释或者B站算法很美(极力推荐,我是从那里学的,给出的常见动规题目类型解析很多,此外还有其他算法),我怕解释错了误导大家(狗头护体,算法资源链接:《算法很美》之动态规划)
---------------------------------------分·割·线-----------------------------------------
-----------此题题解-----------
完整题目:

完整通过代码
*#include<iostream>
using namespace std;
struct thing
{
int pri;
int lev;
};
int main()
{
int summoney,sumthin;
int dp[2][30005]={0};
int maxv=0;
struct thing thi[30];
cin>>summoney>>sumthin;
for(int i=0;i<sumthin;i++)
{
cin>>thi[i].pri>>thi[i].lev;
}
for(int i=1;i<=summoney;i++)
{
if(i>=thi[0].pri)
{
dp[0][i]=thi[0].lev*thi[0].pri;
}
}
for(int i=1;i<sumthin;i++)
{
for(int j=1,s=0,t=0;j<=summoney;j++)
{
s=0;
if(j>=thi[i].pri)
{
t=j-thi[i].pri;
s=thi[i].lev*thi[i].pri+dp[(i-1)%2][t];
dp[i%2][j]=s>dp[(i-1)%2][j]?s:dp[(i-1)%2][j];
}
else
{
dp[i%2][j]=dp[(i-1)%2][j];
}
maxv=maxv>dp[i%2][j]?maxv:dp[i%2][j];
}
}
cout<<maxv;
return 0;
}*
--------------------------------------总结分割线--------------------------------------
以上为鄙人拙见,若有错误或建议,还请不吝指出,若有需要解释的
地方,可以私信或者QQ联系(个人资料有,非诚勿扰,感谢)