2016-09-18 2 views
-4

나는 지정된 값을 얻기 위해 동전의 최소 개수를 계산하는이 함수를 작성해야합니다.동전은 반환 값으로 특정 동전의 유형으로 바뀝니다

매개 변수와 함수 값 (INT)와이 주화의 종류와 그 값을 예로서

(코인 변화 기본 버전로부터 약간 다름)에 대한 정보를 갖는 문자열을 가지고

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

그래서이 값을 I '는'9의 값으로 호출 경화가이 경우 20 , 2 값의 값 1 코인 'C'코인 'B' 그래서 결국이 함수는 나에게 동전을 가져다주는 me'eab '을 반환 할 것입니다. 그리고 한 번에 최소 있는 동전 'B'는 여기에 몇 가지 othere 테스트 케이스입니다

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)를 이미 보았습니다.하지만 동전의 유형을 관리 할 수있는 방법이 없습니다.

+0

는 "동전의 종류를 관리". 동전 목록을 구문 분석하여 배열이나 목록에 넣어야합니다. 목록에서','의 수를 읽고 num_commas + 1로 배열을 할당 한 다음 목록을 파싱 할 수 있습니다 (이 경우 여러 함수가 있습니다, 예를 들어'strtok'). – Nidhoegger

+0

C에서 문자열을 반환하는 경우 일반적으로 일부 문자열이 첨부됩니다. ㅎ. 다시 말해 반환 된 문자열에 대한 메모리 관리에 대해 생각해야합니다. – unwind

+3

또한이 프로그램에 대한 "최소 접근법"으로 작동하지 않는 테스트 사례를 추가합니다 (위에서 아래로 및 빼기). 이 사례를 시도해보십시오 :'coin (12, "a : 10, b : 8, c : 4, d : 1"). 이것은 최소한의 접근 ('add')으로 3 동전을 줄 것이고, 정답은 2 개의 coinds ('bc')입니다. – Nidhoegger

답변

1

이것은 여러 가지 방법으로 해결할 수 있습니다. 당신을 시작할 수있는 하나의 방법이 있습니다. 즉,

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

이 그럼 당신은 입력 문자열을 구문 분석 할 필요가 이름과 값으로 분할하고 나중에 사용할 수 있도록 배열에 저장 :

은 동전의 이름과 값을 유지하는 struct을 정의합니다. 같은 뭔가 :

#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 
+0

고맙습니다. 코드 작업을 계속 진행하는 데 몇 가지 문제가 있습니다. 무엇을 할 지 알아 내기 위해이 guid (https://prismoskills.appspot.com/lessons/Dynamic_Programming/Chapter_04_-_Minimum_no_of_coins_to_make_a_sum.jsp)를 사용하십시오. . 코인 함수의'char * s' 매개 변수의 크기를 찾는 방법을 모르겠다. – totoro

+0

@chux - 감사합니다. 잠시 동안 나는 NULL로 호출되는 realloc이 malloc과 동일하다는 것을 잊어 버렸습니다. 답변이 업데이트되었습니다. – 4386427

+0

@totoro - 왜'char * s'의 크기가 필요한가요? 코드는 그 부분을 처리합니다. – 4386427

관련 문제