#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; 我被红色警报绊倒了。
我对传递参数感到困惑。
有没有人可以帮助我?非常感谢:)
答案 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 **
T
为int
。
当这个数组作为参数传递时,它被隐式转换为指向其第一个元素的指针,并且类型为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)