2016-05-06 10 views
-1

Итак, я создаю алгоритм замены монет, который принимает значение N и любое количество номиналов, и если у него нет 1, я должен автоматически включать 1. Я уже сделал это, но есть недостаток, теперь у меня есть 2 матрицы, и мне нужно использовать 1 из них. Возможно ли переписать S [i] матрицу и все еще увеличить размер массива .... Также как я могу найти наивысшее достоинство, а второе - наименьшее? Должен ли я просто сортировать его в наивысшем до наименьшего, чтобы облегчить его или есть более простой способ поиска их один за другим?Жадный алгоритм для смены монет C++

int main() 
{ 
    int N,coin; 
    bool hasOne; 
    cout << "Enter the value N to produce: " << endl; 
    cin >> N; 
    cout << "Enter number of different coins: " << endl; 
    cin >> coin; 

    int *S = new int[coin]; 

    cout << "Enter the denominations to use with a space after it" << endl; 
    cout << "(1 will be added if necessary): " << endl; 
    for(int i = 0; i < coin; i++) 
    { 
     cin >> S[i]; 
     if(S[i] == 1) 
     { 
      hasOne = true; 
     } 
     cout << S[i] << " "; 
    } 
    cout << endl; 
    if(!hasOne) 
    { 
     int *newS = new int[coin]; 
     for(int i = 0; i < coin; i++) 
     { 
      newS[i] = S[i]; 
      newS[coin-1] = 1; 
      cout << newS[i] << " "; 
     } 
     cout << endl; 
     cout << "1 has been included" << endl; 
    } 

    //system("PAUSE"); 
    return 0; 
} 
+0

Я хотел бы предложить только сортируя их в порядке вам нужно. Я не уверен, почему вы добавляете 1, если «необходимо» - что относительно валют, у которых нет монеты со значением 1? Например, с 1950 по 2000 год [Лира монеты] (https://en.wikipedia.org/wiki/Coins_of_the_Italian_lira) использовались с немногими, если таковые имеются, 1 лирские монеты, оставшиеся в обращении. –

+0

да, но мы не хотим ситуации w здесь 33 мы не можем получить его, потому что нет 1, так что это необходимо – Darkflame

+0

Если пользователь вводит ввод, который не имеет смысла, вы должны сообщить им. У вас нет возможности узнать, входила ли ошибка в 33 для суммы или не включала 1 в набор монет. Вы добавляете 1, нужно ли это или нет. –

ответ

1

Вы могли бы реализовать его с станд :: вектор, то вам нужно использовать только push_back.

std::sort можно использовать для сортировки деноминаций в порядке убывания, то это вопрос проверки последнего: 1 и добавления его, если он отсутствует. (В этом коде отсутствует ошибка проверки ошибок, например, вы должны, вероятно, проверить, что нет деноминации> = 0, так как вы используете целые числа со знаком).

#include <iostream> // for std::cout/std::cin 
#include <vector>  // for std::vector 
#include <algorithm> // for std::sort 

int main() 
{ 
    std::cout << "Enter the value N to produce:\n"; 
    int N; 
    std::cin >> N; 

    std::cout << "Enter the number of different denominations:\n"; 
    size_t denomCount; 
    std::cin >> denomCount; 

    std::vector<int> denominations(denomCount); 
    for (size_t i = 0; i < denomCount; ++i) { 
     std::cout << "Enter denomination #" << (i + 1) << ":\n"; 
     std::cin >> denominations[i]; 
    } 

    // sort into descending order. 
    std::sort(denominations.begin(), denominations.end(), 
     [](int lhs, int rhs) { return lhs > rhs; }); 

    // if the lowest denom isn't 1... add 1. 
    if (denominations.back() != 1) 
     denominations.push_back(1); 

    for (int coin: denominations) { 
     int numCoins = N/coin; 
     N %= coin; 
     if (numCoins > 0) 
      std::cout << numCoins << " x " << coin << '\n'; 
    } 

    return 0; 
} 

Живая демонстрация: http://ideone.com/h2SIHs

+0

hmmm what is size_t denomCount; ? это проверка размера? я попробовал вектор, но у меня действительно не было хорошего понимания этого, поэтому я думаю, что плохо попробую еще раз – Darkflame

+0

@Darkflame denomCount - это количество наименований, которые пользователь собирается ввести, 'size_t'" может хранить максимальный размер теоретически возможный объект любого типа (в том числе массив) "(http://en.cppreference.com/w/cpp/types/size_t) Итак, какие контейнеры стандартной библиотеки, такие как std :: vector, используют для передачи/возврата размеров - это возвращаемый тип 'vector :: size()' – kfsone