函数参数有什么问题?

时间:2015-04-21 11:30:31

标签: c++

#include <iostream>
using namespace std;

template<class Type>
void Knapsack(Type *v,int *w,int c,int n,Type **m)
{
 int i,j;
    int jMax=max(w[n]-1,c);
    for(j=0;j<=jMax;j++)
    m[n][j]=0;
for(j=w[n];j<=c;j++)
    m[n][j]=v[n];
for(i=n-1;i>1;i--)
{
    for(j=0;j<=w[i]-1;j++)
        m[i][j]=m[i+1][j];
    for(j=w[i];j<=c;j++)
    {
        m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
    }
}
m[1][c]=m[2][c];
if(c>=w[1])
    m[1][c]=max(m[2][c],m[1][c-w[1]]+v[1]);

}

template <class Type>
void TrackBack(Type **m,int *w,int c,int n,int *x){
for(int i=1;i<=n;i++)
{
    if(m[i][c]==m[i+1][c])
        x[i]=0;
    else
        x[i]=1;
}
}

int main()
{
int m[101][101]={0};
int x[101];
int n=5;
int c=10;
int w[5]={2,2,6,5,4};
int v[5]={6,3,5,4,6};

Knapsack(v,w,c,n,m);


return 0;
}

我正在编写01背包问题的算法。

我的Xcode说&#34;没有匹配功能可以拨打&#39;背包&#39; &#34; 我被红色警报绊倒了。

我对传递参数感到困惑。

有没有人可以帮助我?非常感谢:)

3 个答案:

答案 0 :(得分:1)

这不是有效的转换:

int m[101][101]
...
Knapsack(v,w,c,n,m);
              // ^-- expects a Type **m

m可以衰减输入&#34;指向101 ints&#34;的数组,但不能再进一步。

答案 1 :(得分:0)

至少是论证的类型

int m[101][101]={0};

不等于T ** Tint

当这个数组作为参数传递时,它被隐式转换为指向其第一个元素的指针,并且类型为int ( * )[101]

考虑到无论如何此功能无效。例如,第二个参数w的参数有5个元素。

int w[5]={2,2,6,5,4};

指数的有效范围是[0,4]。函数调用中的n等于5.

所以这句话

int jMax=max(w[n]-1,c);

具有未定义的行为,因为您使用的不允许索引等于5。

template<class Type>
void Knapsack(Type *v,int *w,int c,int n,Type **m)
{
 int i,j;
    int jMax=max(w[n]-1,c);
//...

答案 2 :(得分:0)

你对函数的定义有点不对劲

template < class Type>
void Knapsack(Type *v,int *w,int c,int n,Type m[][101])

template < class Type>
void TrackBack(Type m[][101],int *w,int c,int n,int *x)