关于二维数组调用有关问题。求高手解答
关于二维数组调用问题。求高手解答
在打算法的0/1背包问题时,老师说不能使用全局变量,所以我把二维数组定义在需要用的函数内,但是程序出错(用全局变量时程序无误)
代码如下:
------解决方案--------------------
局部变量在栈上分配空间,VC默认栈大小是1M
900*900*4=3240000,栈溢出了。
不让用全局变量的话,要么用malloc在堆上分配空间,要么在设置里调大栈空间。
------解决方案--------------------
真的是很大啊!
------解决方案--------------------
static int C[900][900];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
在打算法的0/1背包问题时,老师说不能使用全局变量,所以我把二维数组定义在需要用的函数内,但是程序出错(用全局变量时程序无误)
代码如下:
#include<iostream.h>
//int C[900][900];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int bag(int c,int n,int w[],int v[],int x[])//背包容量C,物品数量n,物品重量w[],物品价值v[],放入背包的判断x[]
{
int C[900][900];
for(int i=0;i<=n;i++)
C[i][0]=0;
for(int j=0;j<=c;j++)
C[0][j]=0;
for(i=0;i<n;i++)//选择货物
for(j=0;j<=c;j++)//选择容量
if(j<w[i])
C[i][j]=C[i-1][j];
else
C[i][j]=max(C[i-1][j],C[i-1][j-w[i]]+v[i]);
//是否放入背包
j=c;
for(i=n-1;i>=0;i--)
{
if(C[i][j]>C[i-1][j])
{
x[i]=1;
j=j-w[i];
}
else
x[i]=0;
}
for(i=0;i<n;i++)
cout<<x[i];
cout<<endl;
int mun=C[n-1][c];
return mun;//返回最大值
}
int main()
{
// int C[900][900];
int s;
int c;
cin>>c;
int n;
cin>>n;
int *w=new int[n];
int *v=new int[n];
int *x=new int[n];
for(int i=0;i<n;i++)
cin>>w[i];
for( i=0;i<n;i++)
cin>>v[i];
s=bag(c,n,w,v,x);
cout<<s<<endl;
return 0;
}
------解决方案--------------------
局部变量在栈上分配空间,VC默认栈大小是1M
900*900*4=3240000,栈溢出了。
不让用全局变量的话,要么用malloc在堆上分配空间,要么在设置里调大栈空间。
------解决方案--------------------
真的是很大啊!
------解决方案--------------------
static int C[900][900];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。