【问题标题】:Understanding fractional knapsack, arrays and pointers了解分数背包、数组和指针
【发布时间】:2017-10-09 00:51:12
【问题描述】:

刚开始学习 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)

我在编译时遇到错误,例如“传递 'knapsack' 的参数 1 会在没有强制转换的情况下从整数生成指针 [-Wint-conversion]”

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

"预期为 int * 但参数的类型为 'int'"

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

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

【问题讨论】:

  • printf() 中将knapsack(value[100],weight[100]) 更改为knapsack(value,weight)
  • 我不明白你关于“良好实践”的最后一个问题。如果函数需要多个相同类型的值,则必须使用数组,没有其他选择
  • int knapsack(int value[], int weight[]) ----> int knapsack(size_t capacity, int value[capacity], int weight[capacity])
  • 注意value[i] / weight[i]是整数除法,其中小数部分被截断;这可能不是你想要的。
  • @GAURANGV VYAS 认为 int value[ ] 不正确,但编译但使用 C99 标准正确读取。

标签: c arrays algorithm pointers


【解决方案1】:
int knapsack(int value[], int weight[])

上述语句为编译器提供了有关如何调用函数(参数类型)和什么函数将返回的信息。

  1. 它说函数 knapsack 将返回一个整数值(第一个 int)。

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

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

点 1、2 和 3 共同构成函数的签名。

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

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

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

这样调用函数:knapsack(value, weight)

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

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

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多