我已经写了一个代码来计算使用贪心算法和动态算法的最小硬币数量,但动态算法部分无法正常工作。数组中有一个 Null 值,我找不到它。请帮我。我需要尽快得到答复。
#include <stdio.h>
int n;
int denom[]={1,2,4,5,20,25};
int coinCounter(int n);
int main(){
printf("Please Enter a Number : ");
scanf("%d",&n);
int coinmin,orin,i;
orin=n;
i=coinmin=0;
for(i=(sizeof(denom)/4)-1;i>=0;i--){
coinmin =coinmin+n/denom[i];
n=n%denom[i];
}
printf("Coin Min By Greedy Algorithm : %d\n",coinmin);
printf("Dynamic Algorithm : %d\n",coinCounter(orin));
return 0;
}
int coinCounter(int n){
int opt[n];
int largest[n];
int i,j,a;
i=j=0;
for(j=1;j<=n;j++){
opt[j]=10000;
//printf("xxn");
for(i=(sizeof(denom)/4)-1;i>=0;i--){
if(denom[i]==j){
opt[j]=1;
largest[j]=j;
}
else if(denom[i]<j){
a=opt[j-denom[i]]+1;
}
if(a<opt[j]){
opt[j]=a;
largest[j]=denom[i];
}
}
}
return opt[n];
}
我编辑了代码如下,但没有得到答案
int coinCounter(int n){
int opt[n];
int largest[n];
int i,j,a;
i=j=0;
for(j=1;j<n;j++){
opt[j]=10000;
printf("xxn");
for(i=(sizeof(denom)/4)-1;i>=0;i--){
if(denom[i]==j){
opt[j]=1;
largest[j]=j;
}
else if(denom[i]<j){
a=opt[j-denom[i]]+1;
}
if(a<opt[j]){
opt[j]=a;
largest[j]=denom[i];
}
}
}
return opt[n-1];
}
嘿,这些是我得到的结果
请输入数字:8
贪心算法的硬币最小:3
动态算法:1
我得到的另一个答案我不知道我做错了什么
请输入数字:71
贪心算法的硬币最小:4
动态算法:3
最佳答案
int coinCounter(int n){
int opt[n];
int largest[n]; <---- Don't do this. This does not work like you expect it to.
改成
int coinCounter(int n){
int opt[n];
int *largest = malloc(sizeof(int)*n);
编辑:
算法的另一个错误
您的变量“a”未初始化,您在 if 条件下使用它。
想想
denom[i]>j
时的情况你的变量 "a"不会被初始化
所以根据它的垃圾值(value),结果会有所不同
错误在这里,但是当您更改 opt 分配时它会出现,因为该分配会更改条件。我想说的是 -
if (X<Y)
,取决于 X 和 Y。问题在于 X,但是因为你改变 Y,条件改变,你得到不同的结果关于C程序空解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13302412/