【问题标题】:0-1 knapsack brute force0-1背包蛮力
【发布时间】:2014-04-28 12:23:50
【问题描述】:

我似乎找不到我用伪代码编写的以下代码的问题。该函数接收带有好处的数组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;
}  

【问题讨论】:

  • 你有逻辑错误还是编译错误?
  • 假设一个背包有两个物品。函数的每条语句应该执行多少次?使用您的调试器或在重要位置插入printf。在你修复它之后,A 在每次迭代中应该假设什么值?使用您的调试器或在重要位置插入printf
  • 谢谢!我遇到了逻辑错误,结果证明是错误的编码。

标签: c brute-force knapsack-problem


【解决方案1】:

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

  • 请正确缩进您的代码。然后,您将看到在两个地方缺少花括号:for 块一直延伸到 return val 之前。对tempWeighttempValue 的两个赋值也应该发生在属于if 语句的一个块内。

  • 条件A[k] = 1 不是您想要的。这是一项(不幸的是)也充当始终为真的条件的分配。将此更改为if (A[k] == 1)。有些人习惯于将常量放在首位,如下所示:if (1 == A[k]),如果您将 = 错误输入为 ==,则会导致编译器错误。

  • 如果你为A分配内存,在从函数返回之前你还必须free它。

  • 您对A[i] 的计算是错误的。这里有大括号,这意味着 j 只有在 A[j] id 不为零时才会更新。您应该在这里实现带有进位的二进制加法。

  • pow 函数对浮点数很有用。在这里,您正在处理整数。使用1 &lt;&lt; i 而不是pow(2, i) 可能会更好。您也可以使用A[i]中最后一位的进位作为终止标准;见下文。

  • 1234563您应该通过在代码块中声明这些变量来收紧您的范围。 (这在这里并不重要,但可以增加大型程序的可读性。)

因此,将所有这些放入您的代码中:

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;
}

【讨论】:

  • 天哪!这是我在该代码上拉头发后第一次在这里发帖。估计我头脑很慢。我非常感谢你指出所有问题。我立即学到了很多 M Oehm 先生!
猜你喜欢
  • 2011-12-18
  • 2015-06-22
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多