了解分数背包,数组和指针

时间:2017-05-10 11:35:47

标签: c arrays algorithm pointers

刚开始学习C编程并决定在Coursera上的算法工具箱中学习一门课程。其中一个挑战是使用分数背包编写代码,最大化战利品的价值,并提供伪代码以帮助编写解决方案。下面是伪代码和我为伪代码编写的代码。

#include<stdio.h>

int min(int a, int b)
{
    if (a < b)
        return a;
    else
        return b;
}

int knapsack(int value[], int weight[])
{
    int capacity = 100;
    int val = 0;
    int array[] = { 0 };
    for (int i = 1; i < capacity; i++)
    {
        if (capacity == 0)
        {
            return val;
        }
        for (int i = 1; i < capacity; i++)
        {
            if (weight[i] > 0 && (value[i] / weight[i]))
            {
                int a = min(weight[i], capacity);
                val = val + a * (value[i] / weight[i]);
                weight[i] = weight[i] - a;
                array[i] = array[i] + a;
                capacity = capacity - a;
            }
        }
    }
    return val;
}

int main()
{
    int value[100];
    int weight[100];
    scanf("%d", &value[100]);
    scanf("%d", &weight[100]);
    printf("%d", knapsack(value[100], weight[100]));
    return 0;
}

伪代码

Knapsack(W, w1,v1,......wn,vn)
A <-- [0,0,], V <-- 0;
repeat n times:
if W =  0:
return (V,A)
select i with Wi > 0 and max vi/wi
a <-- min(wi, W)
V <-- V + a(vi/wi)
wi <-- wi - a, A[i] <-- A[i] + a, W <-- W - a
return (V, A)

我编译时遇到错误,例如&#34;传递&#39;背包的参数1&#39;从整数中生成指针而不使用强制转换[-Wint-conversion]&#34;

printf("%d", knapsack(value[100],weight[100]));

&#34;期望int *但是参数的类型为&#39; int&#39;&#34;

int knapsack(int value[], int weight[])

我还想知道在函数int value[], int weight[]参数中声明int knapsack是否是一个好习惯,以及在这种情况下使用数组和指针的更多解释。

1 个答案:

答案 0 :(得分:0)

int knapsack(int value[], int weight[])

上面的语句为编译器提供了有关 HOW 函数应被调用的信息(参数类型)和 WHAT 函数将返回的信息。

  1. 它表示函数背包将返回一个整数值(第1个int)。

  2. 它的名字是背包(区分大小写)。

  3. 它需要两个参数:整数数组(命名值)和整数数组(命名为权重)。

  4. 第1,2和3点共同构成了函数的签名。

    要调用该函数,必须传递2个整数数组作为其参数。

    错误value[100]对应于数组中的 INTEGER ENTRY ,而不是数组本身。

    要传递数组,您应该将数组名称作为其参数传递,这是您的函数所期望的。

    调用此函数:knapsack(value, weight)

    value 对应数组值 weight 对应数组权重

    此外,传递value[100]对应于一些不在数组边界内的垃圾值,因为您只能访问从value[0]value[99](基于0的索引)的元素。 / p>