思路:
用状态压缩举出每一种状态,在判断是否可以满足大于limit的目标,满足则记录当前选取的cookbooks 的ans。
eg :共三本书。选取第一本第二本 :i = 3 。 二进制表示则为 0 1 1
小菜鸡一个,做了两个来小时就写了三道。。。日了x了。。最后一道好像是拓扑还是啥来着,没怎么用过挺可惜的。被关在学校外面只能在网吧写,eclipse 下了三个小时才下完 qaq
class Solution {
static int[][][][]f;
public int perfectMenu(int[] materials, int[][] cookbooks, int[][] attribute, int limit) {
int n = cookbooks.length;
int ans = -1;
for(int m = 1 ; m < (1<<n); m++){
int j = m;
int[] val = new int[2];
List<Integer> li = new ArrayList<>();
int cnt = 0;
while(j > 0){
if((j&1)==1){
li.add(cnt);
}
cnt++;
j>>=1;
}
boolean flag = true;
for(int i = 0 ; i < li.size();i++){
val[1] += attribute[li.get(i)][1];
val[0] += attribute[li.get(i)][0];
}
if(val[1] < limit) continue;
int[] now = new int[5];
for(int i = 0 ; i < 5 ; i++){
for( j = 0 ; j < li.size() ; j++){
now[i] += cookbooks[li.get(j)][i];
}
if(now[i] > materials[i]){
flag = false;
break;
}
}
if(flag) ans =Math.max(ans,val[0]);
}
return ans;
}
}