2016-05-06 6 views
-1

したがって、値Nと任意の金額を取るコイン変更アルゴリズムを作成しています.1を持たない場合は、自動的に1を含める必要があります。私はすでにこれをしましたが、欠陥があります。私は2つのマトリックスを持っています。私はそれらの1つを使用する必要があります。 S [i]行列を書き直しても、配列の大きさを増やすことは可能ですか?また、最小金額まで、最大金額と2番目に高い金額を見つける方法はありますか?私はそれを簡単にするために最高から最低に並べ替えるべきですか、それを次々に探し出す簡単な方法がありますか?貨幣交換の欲張りアルゴリズム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年にかけて、[Lira coins](https://en.wikipedia.org/wiki/Coins_of_the_Italian_lira)が流通中に残っているリラコアはほとんどありませんでした。 –

+0

yeaしかし、私たちはここでは状況33を望んでいません。何もないので、必要ではありません。 – Darkflame

+0

ユーザーが意味を持たない入力を入力すると、それらを伝える必要があります。あなたは、間違いが金額に33を入力したか、コインのセットに1を含まないかを知る方法がありません。あなたはそれが必要かどうか1を加えています。 –

答えて

1

これをstd :: vectorで実装すると、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 size_t denomCountとは何ですか? ?そのサイズのチェックですか?私はベクトルを試みましたが、実際にはそれをよく理解していなかったので、もう一度試してみてください。 – Darkflame

+0

@Darkflame denomCountは、ユーザーが入力する金額の数です。「size_t」は理論上最大サイズを格納できます(配列を含む)任意のオブジェクトの可能なオブジェクト "(http://en.cppreference.com/w/cpp/types/size_t)したがって、標準ライブラリのコンテナは、std :: vectorのように、サイズを渡したり返すために使用します。戻り値の型は 'vector :: size()'です。 – kfsone

関連する問題