硬币根据特定硬币的类型更改为返回值

时间:2016-09-18 10:50:53

标签: c dynamic-programming coin-change

我需要编写这个函数来计算获得指定值的最小硬币数。

作为参数的函数有一个值(int)和一个字符串,它包含有关硬币类型及其值的信息(它与硬币更改的经典版本略有不同)

作为一个例子:

coin(20, "a:9,b:2,c:1");

所以我的价值是20。 在这种情况下,我有一个名为' a'价值9,硬币' b'价值2和硬币' c'价值1 所以最后这个功能会让我回归' aab'我使用2次硬币' a'还有一次硬币' b'这是最低限度的 以下是一些其他测试用例:

assert(strcmp(coin(4, "a:5,b:2,c:1"),"bb")==0); assert(strcmp(coin(12,"a:3,b:2"),"aaaa")==0);

希望有人可以帮助我。 我已经看到一些具有相同问题的示例(http://code.geeksforgeeks.org/jeuR48),但我真的不知道如何管理硬币类型

1 个答案:

答案 0 :(得分:1)

这可以通过多种方式解决。这是一种可以帮助您入门的方法。

定义struct以保存硬币名称和值:

struct CoinType
{
    char name;
    unsigned int value;
};

然后您需要解析输入字符串,即将其拆分为名称和值,并将其保存在数组中供以后使用。类似的东西:

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

struct CoinType
{
  char name;
  unsigned int value;
};

int getCoins(struct CoinType **ct, char* s)
{
  char *token;
  char name;
  unsigned int value;
  int n = 0;

  token = strtok(s, ",");
  while(token)
  {
    if (sscanf(token, "%c:%u", &name, &value) != 2)
    {
      // Illegal input
      exit(1);
    }

    *ct = realloc(*ct, (n+1)*sizeof(struct CoinType));
    if (*ct == NULL)
    {
      // Out of mem
      exit(1);
    }

    (*ct)[n].name = name;
    (*ct)[n].value = value;
    ++n;

    token = strtok(NULL, ",");
  }
  return n;
}

void printCoins(struct CoinType *ct, int n)
{
  int i;
  printf("Coins available:\n");
  for (i=0; i<n; ++i)
  {
    printf("name=%c with value=%u\n", ct[i].name, ct[i].value);
  }
}

void coin(unsigned int amount, char* s)
{
  struct CoinType *ct = NULL;
  int coins = getCoins(&ct, s);
  printCoins(ct, coins);

  // Add code to match a number of coins with amount

  // Clean up
  free(ct);
}

int main(void)
{
  char s[] = "a:9,b:2,c:1";
  coin(20, s);

  return 0;
}

这将输出:

Coins available:
name=a with value=9
name=b with value=2
name=c with value=1