我有一个家庭作业问题,用户输入了一些硬币N.如果这些硬币可以由便士,镍币,硬币和四分之一组合而成,那么该程序应该可以找到你可以赚到的所有金额。
我读过其他帖子,他们向我们推荐动态编程,所以我在我的程序中使用DP来解决下面的解决方案:
#include <stdio.h>
#include <stdlib.h>
// q(quater), d (dime), n(nickle), p(penny).
int find_coin(int *q, int *d, int *n, int *p, int k)
{
int count = 0;
*q = k / 25;
count += *q;
k = k % 25;
*d = k / 10;
count += *d;
k = k % 10;
*n = k / 5;
count += *n;
k = k % 5;
*p = k;
count += *p;
return count;
}
int main() {
int q,d,n,p;
int k = 0;
int i = 0;
int counts = 0;
puts("\nEnter a number of coins: ");
scanf("%d", &k);
find_coin(&q, &d, &n, &p, k);
printf("%3d cents:\t", k);
printf("total of pennies: %d ",p);
printf("total of nickles: %d ",n);
printf("total of Dimes: %d ",d);
printf("total of quaters: %d \n",q);
getchar();
}
我的输出是:
Enter a number of coins:
5
5 cents: total of pennies: 0 total of nickles: 1 total of Dimes: 0 total of quaters: 0
但是我的教授现在问我这个输出:
Enter the number of coins
2
2 cents: 0 quarters 0 dimes 0 nickels 2 pennies
6 cents: 0 quarters 0 dimes 1 nickels 1 pennies
11 cents: 0 quarters 1 dimes 0 nickels 1 pennies
15 cents: 0 quarters 1 dimes 1 nickels 0 pennies
20 cents: 0 quarters 2 dimes 0 nickels 0 pennies
26 cents: 1 quarters 0 dimes 0 nickels 1 pennies
30 cents: 1 quarters 0 dimes 1 nickels 0 pennies
35 cents: 1 quarters 1 dimes 0 nickels 0 pennies
50 cents: 2 quarters 0 dimes 0 nickels 0 pennies
我使用循环尝试了我的解决方案,但我的循环不正确。我在循环重载的代码中做错了什么:
for(i = 1; i > counts; i++) {
printf("%3d cents:\t", k);
printf("total of pennies: %d ",p);
printf("total of nickles: %d ",n);
printf("total of Dimes: %d ",d);
printf("total of quaters: %d \n",q);
k++;
}
答案 0 :(得分:0)
你已经倒退了,并且可能因为阅读解决方案而感到困惑,这些问题的唯一相似之处在于处理硬币问题。看看它的作用:
int find_coin(int *q, int *d, int *n, int *p, int k)
该例行程序以{美分'为单位获取金额k
,并返回可以达到该金额的最少数量的硬币的明细。然后它返回硬币数。因此,如果您将k
分为26美分,则会将1
推入*q
,将*d
和*n
保留为零,并为您提供{{1}一分钱和四分之一分为26美分 - 返回值表示两个总硬币。它不会给你*p
26分26美分。
(我将指出这与这个概念无关,这个概念的名称有些误导&#34;动态编程&#34;。)
因此,如果该计划的目标是采用总货币值然后打印出最少的硬币,那么您的程序将是正确的。想象一下,如果提示说:
*p
然后,如果你输入5就像你的情况一样,&#34;最佳&#34;答案是一枚镍币。这就是你得到的。正确回答您未分配的问题。
真正的问题是关于combinations。如果我可以有两个硬币,它们可以是套装中的任何一个......我希望这些硬币可以分为两个季度,最多50美分。但问题是所有的可能性是什么,而不是两次计算可能性。所以你只需要提两个便士一次就赚2美分。
看看你的提示实际上是什么:
Enter a number of cents:
这里的一个好教训是,您应该将您的变量名称与问题陈述中的内容对齐。问题陈述(和你的问题标题)都谈到&#34; n&#34;硬币。那么为什么不调用您的变量Enter a number of coins:
或n
?当你有意义地命名时,错误会跳出页面,就像美分和硬币之间的不匹配一样:
coins
在这上添加一些随意的循环并不能让你找到正确的答案。所以现在是时候回到绘图板了。你需要基本上与printf("%3d cents:\t", coins);
相反的东西......需要花费一些季度,硬币,镍币和硬币的东西,并且能够回报你所代表的金额。还有一些循环和一些关于如何产生组合的研究。
(注意:当我提到偶然的循环不能得到答案时,我的意思是它真的不能。有人可能会认为,如果你被要求做5个硬币,你可以说五分钱的最高金额为5分25分...五分钱的最低分为5倍1,然后从5分到125分,打印出find_coin
返回的所有分数但是,你能看出为什么那不起作用吗?find_coins
找不到五便士的情况,因为它效率低,而且它只能看作一个镍但是你被要求找到5个硬币的所有组合,这样就需要找到并输出一个组合。)