在代码的递归版本中,我使用查找表来避免重新计算。但我无法弄清楚它是否比自下而上的方法更好。所以它更好吗?并且我尝试用n = 20求解并且它没有给出堆栈溢出错误。那么,这种方法很好吗?而且如果我尝试在相同的代码中使用W = 90并且所有其他输入保持相同(如下面的代码中所示),我会得到一些垃圾值作为答案,为什么?
我知道用最大值全局声明看数组并不是好方法(浪费内存)。我可以在大小为n x W + 1的动态主函数中声明它,我试过了。但是当我试图在函数中传递它时(Dev-C ++)给了我一个警告,从不兼容的指针类型传递arg并首先忽略警告并运行程序我在输出中什么都没有。可能是什么原因。
PS:我是初学者,非常感谢。
#include<stdio.h>
#define MAXN 20
#define MAXW 100
int look[MAXN][MAXW];
int max(int a, int b){
return (a > b)? a : b;
}
int knapSack(int W, int wt[], int val[], int n){
if (n == -1 || W == 0)
return 0;
if(look[n][W]!=-1)
return look[n][W];
if (wt[n] > W){
look[n-1][W]=knapSack(W, wt, val, n-1);
look[n][W]=look[n-1][W];
}
else
look[n][W]=max( val[n] + knapSack(W-wt[n], wt, val, n-1),knapSack(W, wt, val, n-1));
return look[n][W];
}
int main(){
int val[] = {7,4,5,1};
int wt[] = {5,4,3,1};
int i,j,W = 7;
int n = sizeof(val)/sizeof(val[0]);
for(i=0;i<n;i++)
for(j=0;j<=W;j++)look[i][j]=-1;
printf("%d", knapSack(W, wt, val, n-1));
return 0;
}
答案 0 :(得分:0)
我得到一些垃圾值作为答案,为什么?
查看函数knapSack()
中的初始语句:
if(look[n][W]!=-1)
return look[n][W];
if (n == -1 || W == 0)
return 0;
函数可以通过递归来调用,n
为-1,你可以在第二个if
语句中使用,但是为时已晚,因为在第一个if
条件下你已经访问未定义的值look[-1][W]
。您可能想要颠倒这两个陈述的顺序。