C 以特定硬币类型作为返回值的硬币更换

C 以特定硬币类型作为返回值的硬币更换,c,dynamic-programming,coin-change,C,Dynamic Programming,Coin Change,我需要编写这个函数来计算最小数量的硬币,以获得指定的值 作为参数的函数有一个值(int)和一个字符串,其中包含有关硬币类型及其值的信息(与硬币兑换的经典版本略有不同) 例如: 硬币(20,“a:9,b:2,c:1”) 所以我的值是20。 在这种情况下,我有一枚硬币叫做“a”,价值为9,硬币叫做“b”,价值为2,硬币叫做“c”,价值为1 最后这个函数将返回我使用的“aab”,我使用了2次硬币“a”和1次硬币“b”,这是最小值 以下是一些其他测试用例: assert(strcmp(硬币(4,“a:5

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

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

例如:

硬币(20,“a:9,b:2,c:1”)

所以我的值是20。 在这种情况下,我有一枚硬币叫做“a”,价值为9,硬币叫做“b”,价值为2,硬币叫做“c”,价值为1 最后这个函数将返回我使用的“aab”,我使用了2次硬币“a”和1次硬币“b”,这是最小值 以下是一些其他测试用例:

assert(strcmp(硬币(4,“a:5,b:2,c:1”),“bb”)=0);
断言(strcmp(硬币(12,“a:3,b:2”),“aaaa”)=0)

希望有人能帮我。
我已经看到了一些例子()有同样的问题,但我真的不知道如何管理硬币的类型

这可以通过多种方式解决。这里有一个方法可以让你开始

定义用于保存硬币名称和价值的结构:

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;
}

你所说的“管理硬币类型”是什么意思。您需要解析coinlist并将其放入数组或列表中。您可以首先读取列表中
的数量,并分配一个带有
num_逗号+1
的数组,然后解析列表(您有几个函数用于此,例如
strtok
)。请注意,C中返回的字符串通常附带一些字符串。呵呵。换句话说,您必须考虑对返回字符串的内存管理,并且还要添加一些测试用例,这些测试用例不能用“最小方法”处理这个程序(自上而下和减法)。试试这个例子:
硬币(12,“a:10,b:8,c:4,d:1”)
。这将使用最小方法(
add
)为您提供3个硬币,正确答案是2个硬币(
bc
)。非常感谢您,我在使用此guid()完成其余代码工作时仍然遇到一些问题,无法确定要做什么。不太确定如何找到coin函数的
char*s
参数的大小,您能帮忙吗me@chux-谢谢。有一瞬间我忘记了用NULL调用realloc与malloc是一样的。答案已更新。@totoro-为什么需要字符大小的
char*s
?代码确实处理该部分。尽管
*ct=realloc(*ct,(n+1)*sizeof(struct CoinType)) OK,考虑<代码> *CT=Realc(*CT,(n+1)*sieOf**(*CT));code>不依赖于显式编码匹配类型。更容易编码、检查和维护。上面的注释是我试图做的,以使coind及其类型的最小值…不确定我错在哪里
Coins available:
name=a with value=9
name=b with value=2
name=c with value=1