我似乎无法通过以下从伪代码编写的代码找到问题。该函数接收具有权益的数组p[]
,具有权重的数组w[]
,Weight - max weight
,size (number of items)
和val (to be returned)
。请帮忙!谢谢。我认为这个问题可能与动态数组或循环有关。
int bruteforce(int p[], int w[], int size, int Weight, int val){
int k, i, j, tempWeight, tempValue;
int *A = (int*)calloc(size, sizeof(int));
for (i = 0; i < pow(2, size); i++)
j = size;
tempWeight = 0;
tempValue = 0;
while (A[j] != 0 && j > 0) {
A[j] = 0;
j = j - 1;
}
A[j] = 1;
for (k = 0; k < size;k++)
if (A[k] = 1)
tempWeight = tempWeight + w[k];
tempValue = tempValue + p[k];
if ((tempValue>val) && (tempWeight <= Weight))
val = tempValue;
return val;
}
答案 0 :(得分:4)
唉!这里发生了很多事情:
请正确缩进代码。然后,您将看到在两个位置缺少大括号:for
块一直延伸到return val
之前。 tempWeight
和tempValue
的两个分配也应该发生在属于if
语句的一个块中。
条件A[k] = 1
不是您想要的。这是一项任务(不幸的是)也是一个永远正确的条件。将其更改为if (A[k] == 1)
。有些人养成了将常量放在第一位的习惯:if (1 == A[k])
如果你为=
输入错误==
,会产生编译错误。
如果您为A
分配内存,则必须先free
才能从该功能返回。
您对A[i]
的计算错误。这里有大括号,这意味着只有当A [j] id不为零时才会更新j
。你应该在这里实现二进制加法。
pow
函数对浮点数很有用。在这里,你正在处理整数。最好使用1 << i
代替pow(2, i)
。您还可以使用A[i]
中最后一位数的值作为终止条件;见下文。
这是一个次要的风格点,但是一旦你在主循环周围有大括号,你就会发现大多数局部变量只在循环中需要。您应该通过在代码块中声明这些变量来收紧范围。 (这在这里并不重要,但可以增加大型程序的可读性。)
因此,将所有这些放入代码中会产生:
int bruteforce(int p[], int w[], int size, int Weight, int val)
{
int *A = (int *) calloc(size, sizeof(int));
int i;
for (i = 0; ; i++) {
int j = size;
int tempWeight = 0;
int tempValue = 0;
int k;
k = 1;
for (j = 0; j < size; j++) {
A[j] += k;
k = A[j] / 2;
A[j] = A[j] % 2;
}
if (k) break;
for (k = 0; k < size; k++) {
if (A[k] == 1) {
tempWeight = tempWeight + w[k];
tempValue = tempValue + p[k];
}
}
if (tempValue > val && tempWeight <= Weight) {
val = tempValue;
}
}
free(A);
return val;
}