物资最大价值问题(回溯法、组合)
题解
思路
- 列出所有符合条件的组合;
- 选择其中使用价值最高的;
- 每次循环比较当前使用价钱sp是否大于预算,大于则进行下一次循环,不大于比较和maxVal的值,更新maxVal;
代码
class Solution {
int sp, sw, maxVal, budget, n;
public:
void combine(vector<pair<int, int>> track, vector<pair<int, int>> &slist, int pinNum) {
/* backtrace */
for (int i = pinNum; i < n; i++) {
if (sp + slist[i].first > budget) {
continue;
}
sp += slist[i].first;
sw += slist[i].second;
if (sw > maxVal) {
maxVal = sw;
}
combine(track, slist, i + 1);
sp -= slist[i].first;
sw -= slist[i].second;
}
}
int getMaxVal() {
std::cin >> budget >> n;
vector<pair<int, int>> pw;
int i = 0;
while (i++ < n) {
int p, w;
std::cin >> p >> w;
pw.push_back(make_pair(p, w));
}
/* calling combine */
maxVal = sp = sw = 0;
combine(vector<pair<int, int>>(), pw, 0);
return maxVal;
}
};
2020/08/03 23:53
@luxurylu