【发布时间】:2016-02-03 17:22:02
【问题描述】:
之前我发布了question 关于硬币自动售货机问题(所需的最低硬币数量)。原来问题是 for 循环中的拼写错误,所以现在程序可以工作了。原来的问题是这样的:
作为自动售货机控制器的程序员,您需要计算构成返还客户所需零钱的最小硬币数量。这个问题的有效解决方案采用动态规划方法,首先计算 1 美分找零所需的硬币数量,然后是 2 美分,然后是 3 美分,直到达到所需的找零,并且每次都使用先前计算的硬币的数量。编写一个包含函数
ComputeChange()的程序,该程序获取有效硬币的列表和所需的零钱。该程序应反复从控制台请求所需的更改并相应地调用ComputeChange()。 它还应该使用“缓存”,其中保留任何先前计算的中间值以供后续查找。
问题是代码使用了递归,因此计算大值需要很长时间。使用缓存应该可以改善这个问题,但我不知道如何去做。代码可以在下面找到。
#include <stdio.h>
#include <limits.h>
int computeChange(int[],int,int);
int min(int[],int);
int main(){
int cur[]={1,2,5,10,20,50,100,200};
int n = sizeof(cur)/sizeof(int);
int v;
printf("Enter a value in euro cents: ");
scanf("%d", &v);
printf("The minimum number of euro coins required is %d", computeChange(cur, v, n));
return 0;
}
int computeChange(int cur[], int v, int n){
if(v < 0)
return INT_MAX;
else if(v == 0)
return 0;
else{
int possible_mins[n], i;
for(i = 0; i < n; i++){
possible_mins[i]=computeChange(cur, v-cur[i], n);
}
return 1+min(possible_mins, n);
};
}
int min(int a[], int n){
int min = INT_MAX, i;
for(i = 0; i < n; i++){
if((a[i]>=0) && (a[i]< min))
min = a[i];
}
return min;
}
【问题讨论】:
标签: c caching dynamic-programming