我正在用C编写一个程序来做一个简单的动态编程算法,在这个算法中你可以返回加到一定数量所需的最小硬币数。这是我的代码:
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
/*
This function returns the minimum number of stamps required for a given value.
It assumes that the given array contains the available stamp sizes, and that it
always contains 1, so a solution is always possible
*/
int min_number_of_stamps(const int* array, size_t array_size, int request) {
/* Construct a table with dimensions (array_size+1)*(request+1) */
int numRows = array_size + 1;
int numCols = request + 1;
int **DPtable;
DPtable = malloc(numRows*sizeof(int));
int i;
for (i = 0; i < numRows; i++) {
DPtable[i] = malloc(numCols*sizeof(int));
}
printf("%d",DPtable[4][0]);
int r, c, useIt, loseIt;
for (r = 0; r < numRows; r++) {
for (c = 0; c < numCols; c++) {
printf("%d,%d\n", r, c);
if (c==0) {
printf("1\n");
//if the amount of change is 0, 0 coins are needed
DPtable[r][c] = 0;
}
else if ((r==0) || c < array[r-1]) {
printf("2\n");
//if there are no coins or if the change needed is less than
//the smallest coin available, then 'infinity' coins are needed
DPtable[r][c] = INT_MAX;
}
else {
printf("3\n");
useIt = DPtable[r][c-array[r-1]] + 1;
loseIt = DPtable[r-1][c];
if (useIt <= loseIt) {
//if 'use it' requires fewer coins than 'lose it,' then
//'use it' coins are needed.
DPtable[r][c] = useIt;
}
else {
//if 'lose it' requires fewer coins, 'lose it' coins are needed
DPtable[r][c] = loseIt;
}
}
}
}
return DPtable[numRows][numCols];
}
int main() {
const int array[] = {1,5,10,25};
const int* stamps = &array[0];
printf("%d", min_number_of_stamps(stamps, 4, 44));
}
当我的内部for循环到达r = 4和c = 0的情况时,我得到一个段错误。我把我的调试打印语句留下了,因为我很懒,但你可以看到我被卡住的地方。如果我在for循环之外访问数组中的相同位置,则没有问题。但是在for循环中,我输出“分段错误:11”消息后,它输出“4,0”表示数组元素,“1”表示if情况。可以有人看到我缺少的吗?
答案 0 :(得分:3)
学习启用警告&amp;调试编译器,即Linux上的gcc -g -Wall
。
学习使用调试器,即Linux上的gdb -tui
。
考虑使用valgrind
修改强> 网上很容易找到GCC,GDB和ValGrind的许多教程(用几种语言,例如英语,法语......)。
答案 1 :(得分:1)
return DPtable[numRows][numCols];
多数民众赞成不是吗?
答案 2 :(得分:1)
您错误地分配了dpTable
。它应该是
DPtable = malloc(numRows*sizeof(int*));
看看是否能解决问题。