0-1背包蛮力

时间:2014-04-28 12:23:51

标签: c brute-force knapsack-problem

我似乎无法通过以下从伪代码编写的代码找到问题。该函数接收具有权益的数组p[],具有权重的数组w[]Weight - max weightsize (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;
}  

1 个答案:

答案 0 :(得分:4)

唉!这里发生了很多事情:

  • 请正确缩进代码。然后,您将看到在两个位置缺少大括号:for块一直延伸到return val之前。 tempWeighttempValue的两个分配也应该发生在属于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;
}