C 以特定硬币类型作为返回值的硬币更换
我需要编写这个函数来计算最小数量的硬币,以获得指定的值 作为参数的函数有一个值(int)和一个字符串,其中包含有关硬币类型及其值的信息(与硬币兑换的经典版本略有不同) 例如: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
硬币(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