LCP51.烹饪料理
思路1:二进制枚举
- 从低位向高位枚举,最低位的
1
表示选用cookbook
中编号为0
的食谱,倒数第2低的1
表示选用cookbook
中编号为1
的食谱,以此类推。 for (int S = 0; S < (1<<n); ++S)
表示枚举种可能,遍历了所有情况。if (S & (1 << i))
表示第i
低位是1
,选用了对应位置的食谱。代码1:
class Solution {
public:
int perfectMenu(vector<int>& materials, vector<vector<int>>& cookbooks, vector<vector<int>>& attribute, int limit) {
int n = cookbooks.size();
int ps[10];
int ans = -1;
for (int S = 0; S < (1 << n); S++) {
for (int i = 0; i < 5; i++) {
ps[i] = 0;
}
int sx = 0, sy = 0;
for (int i = 0; i < n; i++) {
if (S & (1 << i)) {
for (int j = 0; j < 5; j++) {
ps[j] += cookbooks[i][j];
}
sx += attribute[i][0];
sy += attribute[i][1];
}
}
bool valid = true;
for (int j = 0; j < 5; j++) {
// cout << ps[j] << " ";
if (ps[j] > materials[j]) {
valid = false;
}
}
if (valid && sy >= limit) {
ans = max(ans, sx);
}
}
return ans;
}
};
思路2:回溯todo