gpt4 book ai didi

c++ - 动态规划、硬币找零、内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 19:20:07 25 4
gpt4 key购买 nike

我正在编写程序来兑换硬币。当我在循环中编写 printf 来打印 i 或 j 程序时给出良好的结果,当我删除它时,程序停止。我认为这是内存问题,但我正在 QT 中的 Windows 上编写,并且无法访问 valgrind。

有人可以检查一下吗?首先给出面额数字,第二个给出面额,最后给出金额。

例如:

3
1 3 5
8

结果应为 2。

1
5
3

结果应该是NO。

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

#define INF 2147483647 //nieskonczonosc


void 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;

}

最佳答案

假设输入格式正确,我可以在您的代码中发现的唯一问题是以下几行:

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) { ... }

您的代码中没有内存泄漏。

关于c++ - 动态规划、硬币找零、内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23024050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com