引自强大而免费的微信小程序:皆我百晓生。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> bestPlan;
vector<int> nutrientNeeded;
vector<vector<int>> foods;
bool canSatisfy(int food, int nutrientNum) {
for (int i = 0; i < nutrientNum; i++) {
if (nutrientNeeded[i] > 0 && foods[food][i] > 0) {
return false;
}
}
return true;
}
void updateNeeded(int food, int nutrientNum, bool negative) {
for (int i = 0; i < nutrientNum; i++) {
if (negative) {
nutrientNeeded[i] -= foods[food][i];
} else {
nutrientNeeded[i] += foods[food][i];
}
}
}
void solve(int nutrientNum, int foodNum) {
vector<int> dp(1 << foodNum, -1);
vector<int> prev(1 << foodNum, -1);
int maxStatus = (1 << foodNum) - 1;
dp[0] = 0;
for (int status = 0; status <= maxStatus; status++) {
for (int food = 0; food < foodNum; food++) {
if ((status & (1 << food)) == 0) {
int nextStatus = status | (1 << food);
if (canSatisfy(food, nutrientNum) && dp[nextStatus] == -1) {
dp[nextStatus] = dp[status] + 1;
prev[nextStatus] = status;
}
}
}
}
int foodStatus = maxStatus;
while (foodStatus != 0) {
int prevStatus = prev[foodStatus];
for (int food = 0; food < foodNum; food++) {
if ((prevStatus & (1 << food)) == 0 && (foodStatus & (1 << food)) != 0) {
bestPlan.push_back(food);
}
}
foodStatus = prevStatus;
}
sort(bestPlan.begin(), bestPlan.end());
}
int main() {
int nutrientNum, foodNum;
cin >> nutrientNum >> foodNum;
foods.resize(foodNum);
for (int i = 0; i < foodNum; i++) {
foods[i].resize(nutrientNum);
for (int j = 0; j < nutrientNum; j++) {
cin >> foods[i][j];
}
}
nutrientNeeded.resize(nutrientNum);
for (int i = 0; i < nutrientNum; i++) {
cin >> nutrientNeeded[i];
}
solve(nutrientNum, foodNum);
for (int i = 0; i < bestPlan.size(); i++) {
cout << bestPlan[i] << " ";
}
cout << endl;
return 0;
}