C ++匹配数组中的双打(匹配中增加条目数)

时间:2015-01-10 18:37:58

标签: c++ combinations permutation

美好的一天,

我对C ++很新。我有一个项目,我需要提出一个匹配的应用程序。

假设共有100个商品,每个商品都有不同的价格,存储在名为PriceDB.txt的文本文件中。

文本文件的结构:

Item1 3.99
Item2 9.99
Item3 11.88
Item4 87.10
Item5 5.69
Item6 13.00
Item7 245.22
... (and so on)

以下是它应该如何运作:

  • c ++应用程序将请求输入您想要匹配的价格
  • 首先将2个商品的价格加在一起(第1项和第1项),它会将总数与您的输入进行比较
  • 如果第1项和第1项的总和Item1价格与输入值不匹配,继续添加Item1& Item2的价格,然后是Item1&第3项等等
  • 如果在第1项和第1项的组合之前总数仍然不匹配Item100,继续添加Item2& Item2,Item2& Item3,Item2&第4项等等
  • 请注意,以上只有2种价格组合。当它达到Item100& Item100仍然没有找到,它继续3个价格组合..
  • E.g。第1项和第1项第1项和第1项Item1,Item1&第1项和第1项Item2,直到Item100& Item100& Item100,继续4个价格组合
  • 此过程将持续到达到100个价格组合。

我已经通过以下代码部分实现了我想要的目标:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;


bool double_equals(double a, double b, double epsilon = 0.01)
{
    return abs(a - b) < epsilon;
}

int main() {

    double PriceToMatch, ItemPrice[5];
    string ItemName[5];

    ifstream PriceDB("PriceDB.txt", ios::binary);

    if (!PriceDB.is_open()) {
        cout << "ERROR: Failed to read price database, exiting...";
        return 1;
    }

    for (int i = 0; !PriceDB.eof(); i++) {
        PriceDB >> ItemName[i];
        PriceDB >> ItemPrice[i];
    }

    cout << "Enter the price to match: ";
    cin >> PriceToMatch;


    for (int i = 0; i < 5; i++) {
        for (int x = i; x < 5; x++) {
            if (double_equals(ItemPrice[i] + ItemPrice[x], PriceToMatch) == true) {
                cout << "Found: " << ItemName[i] << " + " << ItemName[x] << endl;
            }
        }
    }

    for (int a = 0; a < 5; a++) {
        for (int b = a; b < 5; b++) {
            for (int c = b; c < 5; c++) {
                if (double_equals(ItemPrice[a] + ItemPrice[b] + ItemPrice[c], PriceToMatch) == true) {
                    cout << "Found: " << ItemName[a] << " + " << ItemName[b] << " + " << ItemName[c] << endl;
                }
            }
        }
    }

    return 0;
}

以上代码适用于2种价格组合和3种价格组合。

但是,我必须在组合中添加更多的If / else以获得更多价格。这将是一个非常大的麻烦,因为它将导致大量的代码页。知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

你能澄清初始任务吗?根据您的描述,我发现您的首要任务是找到一组最小数字。这是你想要的吗? 我只是假设你想尽快找到答案:) 那么你可以做什么:

  1. 对数组进行排序(按降序排列)
  2. 启动递归功能(如果愿意,可以将其重写为循环形式)
  3. 功能可能如下所示:

    bool FindPriceToMatchFromPos(int pos, int PriceToMatch)
    {
        if (ItemPrice[pos] == PriceToMatch) // Found the answer
        {
            resultIndices.push_back(pos); 
            return true;
        }
        else if (ItemPrice[pos] < PriceToMatch && pos < ItemPrice.size() - 1)
        {
            int residue = PriceToMatch - ItemPrice[pos];
            for (int i = pos + 1; i < ItemPrice.size(); i++)
            {
                if (FindPriceToMatchFromPos(i, residue))
                {
                    resultIndices.push_back(pos);
                    return true;
                }
            }
        }
        return false;
    }
    

    你主要是:

    int main ()
    {
    // There will be your result indices (or you can store values instead)
    vector<int> resultIndices; 
    
    bool SolutionFound = false;
    for (int CurrentPosition = 0; !SolutionFound && CurrentPosition < ItemPrice.size(); CurrentPosition++)
         SolutionFound = FindPriceToMatchFromPos(CurrentPosition,  PriceToMatch);
    // Your results (if any) stored in "resultIndices"
    }
    

    提示:如果您的程序仅以2位小数精度运行,我建议您将值乘以100并将它们存储为整数。这样你就不会需要那种丑陋的比较功能;) PS。对不起我的英文

    有关您问题的更多理论详情,请访问:Sum-subset with a fixed subset size