在Knapsack程序中将2D数组作为1D数组传递

时间:2015-02-24 10:27:22

标签: c++ arrays stack-overflow knapsack-problem

我正在编写一个背包问题的程序,其中我们需要找出实现目标的最低成本,否则无法打印。否则无法实现。
我传递成本和值的二维数组作为指向一维数组的指针。当目标值大约为5000时,代码运行正常。但是对于更高的数字,程序将被强制关闭。由于它不适用于较大的值而导致的错误是什么?

  

[问题]
  第一行是测试用例的数量。重量的   空杯子,E和装满的果汁杯F的重量给出   分别作为每个测试用例第一行的空白。 (1≤E≤F   ≤10,000)。目标= F-E。使用的果汁种类数,N,   给出下一行。 (1≤N≤500)从下一行开始   对于N行的数量,每种果汁的单价和重量是   单独给出空白。果汁的单价是正数   ≤50,000;重量是正数≤10000。

     

输入:
  1
  10 110
  2
  1 1
  30 50

     

输出:
  60

代码:

int calculate( int variable, int* input, int n)
{
int array[n+1][variable+1];
for(int j=0; j<variable+1; j++)
    array[0][j]=100000000;
for(int i=1; i<n+1; i++)
{
    for(int j=0; j<variable+1; j++)
    {
        if(j==0)
            array[i][j]=0;
        else if(j<input[n+i-1])
            array[i][j]=array[i-1][j];
        else
            array[i][j]=min(array[i-1][j], input[i-1]+array[i][j-input[n+i-1]]);
    }
}
return array[n][variable];
}

int main(int argc, char** argv)
{
int testcase;
cin>>testcase;
for(int t=0; t<testcase; t++)
{
    int cup1=0, cup2=0, n=0, result=0;
    cin>>cup1>>cup2>>n;
    int input[2][n];
    for(int j=0; j<n; j++)
    {
        for(int i=0; i<2; i++)
            cin>>input[i][j];
    }
    int variable=cup2-cup1;
    result=calculate(variable, (int*) input, n);
    if(result<100000000)
        cout<<result<<endl;
    else
        cout<<"impossible"<<endl;
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

result=calculate(variable, (int*) input, n);

应该是

result=calculate(variable, input[0], n);

查看二维阵列结构。

对于较大的n值,可能会耗尽堆栈空间。你可能不得不使用新的。如果你需要使用new,你需要分配1D数组,如果你想将它用作1D数组,否则它不会在连续的内存中。