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
