亲宝软件园·资讯

展开

关于大数组定义为全局变量和内部变量的一些区别

TOBE_ACODER 人气:0

什么是全局变量和main函数中的变量

在我个人浅显的理解下,我所认为的全局变量就是定义在函数外部,作用于整个代码的变量类型
而定义在函数中的变量就是只作用于该函数内部的变量
这两者除此之外再无区别

当我刷了一段时间的题后~尤其是当我们今天看到dp背包问题的模板题时,我对这两者又有了不一样的认识和感受

情形如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
 int f[1010][1010], v[1010], w[1010];
 int N, V;
 cin >> N >> V;
 for(int i = 1;i <= N; i++) cin >> v[i] >> w[i];

 for(int i = 1;i <= N; i++)
   for(int j = 0;j <= V; j++)
   {
     f[i][j] = f[i-1][j];
     if(j >= w[i])
     {
       f[i][j] = max(f[i][j], f[i-1][j-v[i]]+w[i]);
     }
     cout << f[N][V] << endl;
     return 0;
   }
}

这是一个再简单不过的完全背包的模板题,当这个题在一些在线评测oj中都可以顺利AC
!!
但是,当我的这种写法在我本地的IDE(VScode)中运行时,发现了无法输入然后一段时间后自动退出程序的现象
起初我一直以为是代码出错
但是后来我才明白是我对于大数组的定义出现了问题。

错误原因

我在上述代码中对于大数组的定义为内部变量
数组定义在函数中会占用 栈空间 ,而往往栈空间比较小,所以大数组定义在函数中会出现内存方面的问题
但是如果将数组定义为全局变量 则分配在 数据段,则不存在所谓的内存问题咯

正确的代码如下:

#include <bits/stdc++.h>
using namespace std;
  int f[1010][1010], v[1010], w[1010];
  int N, V;
int main()
{
  cin >> N >> V;
  for(int i = 1;i <= N; i++) cin >> v[i] >> w[i];

  for(int i = 1;i <= N; i++)
    for(int j = 0;j <= V; j++)
    {
      f[i][j] = f[i-1][j];
      if(j >= w[i])
      {
        f[i][j] = max(f[i][j], f[i-1][j-v[i]]+w[i]);
      }
      cout << f[N][V] << endl;
      return 0;
    }
}

总结

我们一般不喜欢使用全局变量无非是害怕全局变量浊化变量名称、占用更大的内存等等,但是当大数组出现时,我们一定要记得的将大数组定义在函数外部!

(希望我的上述总结能够为你带来一些收获,大一菜鸡的一点点小想法,如有思路内容不妥之处,还望各位大佬前辈不吝赐教)

加载全部内容

相关教程
猜你喜欢
用户评论