打印所有可以使用n个硬币支付的金额

时间:2014-10-29 01:53:32

标签: c combinations currency

我有一个家庭作业问题,用户输入了一些硬币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++;
}

1 个答案:

答案 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个硬币的所有组合,这样就需要找到并输出一个组合。)