Answer:
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <iomanip>
#include <sstream>
using namespace std;
// Given struct
struct Camera {
// Declaring variables
 string manufacturer;
 string model;
 int releaseYear;
 int resolution;
 int weight;
 double price;
};
vector<string> bestValue(const vector<Camera>& cameraNew) {
 vector<string> display;
 double winnerOne = 0;
 double winnerTwo = 0;
 double realWinnerOne = 0;
 double realWinnerTwo = 0;
 string displayOne;
 string displayTwo;
 string ans;
 int find = 0;
 // Calculating best value using given formula
 for (unsigned i = 1; i < cameraNew.size(); i++) {
 winnerOne = cameraNew[i].price / static_cast<double>(cameraNew[i].resolution);
 winnerTwo = cameraNew[i-1].price / static_cast<double>(cameraNew[i - 1].resolution);
 if (cameraNew[i].manufacturer == cameraNew[i - 1].manufacturer) {
 if (winnerOne > winnerTwo && winnerOne > realWinnerOne) {
 find = 1;
 }
 else if (winnerOne < winnerTwo && winnerTwo > realWinnerTwo) {
 find = 2;
 }
 if (find == 1) {
 realWinnerOne = cameraNew[i].price/ static_cast<double>(cameraNew[i].resolution) ;
 ostringstream displayStream1;
 displayStream1 << fixed << setprecision(2) << cameraNew[i].price;
 displayOne = cameraNew[i].manufacturer + ":" + cameraNew[i].model + ":$" + displayStream1.str();
 find = 0;
 }
 else if (find == 2) {
 realWinnerTwo = cameraNew[i - 1].price / static_cast<double>(cameraNew[i - 1].resolution);
 ostringstream displayStream2;
 displayStream2 << fixed << setprecision(2) << cameraNew[i - 1].price;
  displayTwo = cameraNew[i-1].manufacturer + ":" + cameraNew[i-1].model + ":$" + displayStream2.str();
 find = 0;
 }
 }
 else {
 if (realWinnerOne >= realWinnerTwo) {
 display.push_back(displayOne);
 realWinnerOne = 0;
 realWinnerTwo = 0;
 }
 else if (realWinnerOne < realWinnerTwo) {
 display.push_back(displayTwo);
 realWinnerOne = 0;
 realWinnerTwo = 0;
 }
 }
 }
 if (realWinnerOne > realWinnerTwo) {
 display.push_back(displayOne);
 }
 else if (realWinnerOne < realWinnerTwo) {
 display.push_back(displayTwo);
 }
 else if (realWinnerOne == realWinnerTwo) {
 display.push_back(displayTwo);
 }
return display;
}
template <typename T>
ostream& operator<<(ostream& out, const vector<T>& display) {
 if (display.size() > 0) {
 out << "0. " << display[0];
 out << endl;
 //displaying output in the given format
 for (size_t i = 1; i < display.size(); i++) {
 out << i << ". " << display[i];
 out << endl;
 }
 }
 else
 {
 out << "Size of the vector is 0 or less than 0." << endl;
 }
 return out;
}
void camBestValue() {
 const vector<Camera> vCameras = {
 { "Agfa", "ePhoto 1280", 1996, 1024, 400, 180 },
 { "Agfa", "ePhoto CL45", 2000, 1600, 275, 180 },
 { "Canon", "PowerShot 350", 1996, 640, 315, 150 },
 { "Canon", "PowerShot 600", 1994, 832, 445, 139 },
 { "Canon", "PowerShot A10", 2001, 1280, 355, 139 },
 { "Casio", "Exilim EX-P505", 2005, 2560, 250, 260 },
 { "Casio", "Exilim EX-P600", 2006, 2816, 275, 260 },
 { "Casio", "Exilim EX-P700", 2006, 3072, 275, 260 },
 { "Epson", "PhotoPC 800", 1997, 1600, 285, 220 },
 { "Epson", "PhotoPC L-500V", 2004, 2560, 205, 150 },
 
 { "Fujifilm", "FinePix 40i", 2000, 2400, 185, 180 },
 { "Fujifilm", "FinePix 50i", 2001, 2400, 205, 180 },
 { "Fujifilm", "DS-260HD", 1997, 1280, 845, 190 },
 { "Fujifilm", "DS-300", 1995, 1280, 845, 200 },
 { "HP", "Photosmart 320", 2002, 1632, 230, 190 },
 { "HP", "Photosmart 435", 2003, 2048, 180, 190 },
 { "HP", "Photosmart 620", 2002, 1632, 260, 190 },
 };
 vector<string> display;
 display = bestValue(vCameras);
 cout << display << endl;
}
int main() {
 camBestValue();
}
Explanation:
The program takes one input parameter: a vector of Camera. The vector is sorted by manufacturer, so all cameras of a particular manufacturer are together in the vector. 
The function returns a vector of string, with the manufacturer, model number and price concatenated together.
It produces the best value.