динамическое программирование, смена монет, утечка памяти?

Я пишу программу для смены монет. Когда я пишу printf в циклах для печати, программа i или j дает хорошие результаты, когда я удаляю ее, программа останавливается. Я думаю, что это проблема с памятью, но я пишу на Windows в QT, и у меня нет доступа к valgrind.

Кто-нибудь может это проверить? Сначала дайте номера деноминаций, второй — деноминации, последний — количество.

Например:

3
1 3 5
8

результат должен быть 2.

1
5
3

результат должен быть НЕТ.

#include <stdio.h>
#include <stdlib.h>

#define INF 2147483647 //nieskonczonoscvoid nominal(int nominaly, int T[], int k)
{
int i;
for (i=1; i<=nominaly; i++ )
{
int n=0;
scanf("%d", &n);
int j;
for ( j=0;j<=k-n;++j) {
if (T[j] < INF)
if (T[j]+1 < T[j+n])
T[j+n] = T[j]+1;

}
}

int kwota=0;
scanf("%d", &kwota);
if(T[kwota]==INF){
printf("NO");
}else
printf("%d", T[kwota]);

}

int main() {

int n=0;

scanf("%d", &n);

int k=10000;
int *T;
T = (int*)malloc(k * sizeof(int));
T[0]=0;
int i;
for (i=1;i<=k;++i)
{
T[i]=INF;
}
nominal(n, T, k);

free(T);
return 0;

}

-1

Решение

Предполагая, что входные данные правильно сформированы, единственная проблема, которую я могу заметить в вашем коде, заключается в следующих строках:

if (T[j]+1 < T[j+n])
T[j+n] = T[j]+1;

когда j достигает значения k-n, T[j+n] это за пределами доступа, потому что вы получаете k-n+nИтак, вы получаете доступ T[k]и последняя действительная позиция T[k-1], Это вызывает неопределенное поведение в вашей программе — может произойти все что угодно (включая работу, как ожидалось).

Вы можете переписать это for цикл к чему-то вроде:

for (j=0; j < k-n;++j) { ... }

В вашем коде нет утечек памяти.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]