【发布时间】: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