C++ (Qt)// структура элементаstruct CReminder { std::vector<int> mRem; // остатки по каждому сырью (0..999) int mSum; // сумма остатков int mTblIndex; // индекс в предыдущей таблице std::vector<int> mAdd; // число произведенных продуктов по каждому сырью}; // подсчет новых остатковint TryAdd( const CReminder & rem, std::vector<int> & data ){ int result = 0; assert(rem.,Rem.size() == data.size()); for (size_t i = 0; i < data.size(); ++i) { int a = rem.mRem[i]; if (data[i]) a = (a + data[i]) % 1000; result += a; } return result;} // шаг (вычисление остатков при производстве 1 продукта)void Step( int productNo, const std::vector<float> & num, std::vector<int> & data ){ assert(data.size() == NUM_RAW); std::fill(data.begin(), data.end(), 0); for (size_t i = 0; i < NUM_RAW; ++i) // по всем видам сырья data[i] = std::remainder(GlobalTable[productNo][i] * num[i], BARREL_SIZE) / BARREL_SIZE * 1000;} void Process1Product( int productNo ){ int numRaw = 0; for (size_t i = 0; i < NUM_RAW; ++i) // кол-во сырья для этого продукта if (GlobalTable[productNo][i]) ++numRaw; float limit[2] = { DEF_LOW_LIMIT, // 10 DEF_HI_LIMIT } // 20 if (numRaw > 1) limit[0] = 0.0f; int rawIndex = 0; Process1ProductRecursive(productNo, 0, rawIndex, numRaw, limit); }