刚开始学习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
是否是一个好习惯,以及在这种情况下使用数组和指针的更多解释。
答案 0 :(得分:0)
int knapsack(int value[], int weight[])
上面的语句为编译器提供了有关 HOW 函数应被调用的信息(参数类型)和 WHAT 函数将返回的信息。
它表示函数背包将返回一个整数值(第1个int)。
它的名字是背包(区分大小写)。
它需要两个参数:整数数组(命名值)和整数数组(命名为权重)。
第1,2和3点共同构成了函数的签名。
要调用该函数,必须传递2个整数数组作为其参数。
错误:value[100]
对应于数组中的 INTEGER ENTRY ,而不是数组本身。
要传递数组,您应该将数组名称作为其参数传递,这是您的函数所期望的。
调用此函数:knapsack(value, weight)
value 对应数组值, weight 对应数组权重
此外,传递value[100]
对应于一些不在数组边界内的垃圾值,因为您只能访问从value[0]
到value[99]
(基于0的索引)的元素。 / p>