一:问题

二:单纯组合
#include <iostream>
#include <vector>
void generateCombinations(const std::vector<char>& elements, int k, int start, std::vector<char>& current, std::vector<std::vector<char>>& result) {
if (current.size() == k) {
result.push_back(current);
return;
}
for (int i = start; i < elements.size(); ++i) {
current.push_back(elements[i]);
generateCombinations(elements, k, i + 1, current, result);
current.pop_back();
}
}
int main2() {
std::vector<char> elements = { 'a', 'b', 'c'};
std::vector<std::vector<char>> result;
std::vector<char> current;
for (int i=1; i<=4; ++i)
{
generateCombinations(elements, i, 0, current, result);
}
std::cout << "C(3, 2) 的所有组合为:" << std::endl;
for (const auto& comb : result) {
for (char ch : comb) {
std::cout << ch << " ";
}
std::cout << std::endl;
}
return 0;
}
C(3, 2) 的所有组合为:
a
b
c
a b
a c
b c
a b c
三:实际解决问题
#include <iostream>
#include <iterator>
#include <vector>
#include <set>
using namespace std;
struct AA {
int p;
int w;
int n;
};
int nMaxR = 0;
int m, n;
std::vector<AA> vA;
void calcData(std::vector<int>& src, std::vector<int>& vTemp, int index, int k)
{
auto calcRes = [&]() {
int nSP = 0;
int nSW = 0;
std::vector<int> sZ(n,0);
for (auto dd : vTemp)
{
if (vA[dd].n == 0 && sZ[dd] == 0)
{
sZ[dd] = 1;
nSP += vA[dd].p;
nSW += vA[dd].p * vA[dd].w;
}
else if(vA[dd].n > 0)
{
nSP += vA[dd].p;
nSW += vA[dd].p * vA[dd].w;
int cz = vA[dd].n - 1;
if (sZ[cz] == 0)
{
sZ[cz] = 1;
nSP += vA[cz].p;
nSW += vA[cz].p * vA[cz].w;
}
}
if(nSP > m)
{
return;
}
}
nMaxR = max(nMaxR, nSW);
};
if (vTemp.size() == k)
{
calcRes();
return;
}
for (int i = index; i < src.size(); ++i)
{
vTemp.push_back(src[i]);
calcData(src, vTemp, i + 1, k);
vTemp.pop_back();
}
}
void calc(std::vector<int>& src, int k)
{
std::vector<int> vTemp;
calcData(src, vTemp, 0, k);
}
int main() {
cin >> m >> n;
vA.resize(n);
std::vector<int> vIndex(n);
for (int i = 0; i < n; ++i)
{
cin >> vA[i].p >> vA[i].w >> vA[i].n;
vIndex[i] = i;
}
for (int i = 1; i <= n; ++i)
{
calc(vIndex, i);
}
cout << nMaxR << endl;
return 0;
}