Problem p00618 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int tani[21];
int needs[21];

// iÌóÔ©çUÈãÌPÊÉ½Çè­Å¬C
int dp[1 << 20];
// s«æ
int U;
int n;

int dfs(int s, int sum) {
  if (dp[s] != -1)
    return dp[s];
  else if (sum >= U) {
    dp[s] = 0;
    return dp[s];
  } else {
    int minCost = 1000000;
    // bool used[21];
    // for(int i = 0; i < n; i++){
    //	if((s>>i)&1)
    //		used[i]=true;
    // }
    //  Â¬ÉÇ±ÖJÚ·é©
    // for(int i = 0; i < tos[s].size(); i++){
    //	minCost=min(minCost,dfs(s|(1<<(tos[s][i])),sum+tani[tos[s][i]])+1);
    //	if(minCost==1)
    //		break;
    // }
    for (int i = 0; i < n; i++) {
      // Ü¾JÚµÄÈ©Á½ç
      if (!((s >> i) & 1)) {
        if (((needs[i]) & s) == needs[i]) {
          minCost = min(minCost, dfs(s | (1 << i), sum + tani[i]) + 1);
          if (minCost == 1)
            break;
        }
        // for(int j = 0; j < vpii[i].second.size(); j++){
        //	if(!used[vpii[i].second[j]]){
        //		f=true;
        //		break;
        //	}
        // }
        // if(!f)
        //	minCost=min(minCost,dfs(s|(1<<i),sum+vpii[i].first)+1);
      }
    }
    dp[s] = minCost;
    return dp[s];
  }
}

int main() {

  int c, k;
  int t;
  int tn;
  while (cin >> n >> U && !(n == 0 && U == 0)) {
    fill(dp, dp + (1 << 20), -1);
    for (int i = 0; i < n; i++) {
      cin >> tani[i] >> k;
      needs[i] = 0;
      for (int j = 0; j < k; j++) {
        cin >> t;
        needs[i] |= (1 << t);
      }
    }
    // for(int s = 0; s < (1<<n); s++){
    //	for(int i = 0; i < n; i++){
    //		if(!((s>>i)&1)){
    //			if(((needs[i])&s)==needs[i]){
    //				tos[s].push_back(i);
    //			}
    //		}
    //	}
    // }
    cout << dfs(0, 0) << endl;
    // for(int i = 0; i < (1<<n); i++)
    //	tos[i].clear();
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int tani[21];
int needs[21];

// iÌóÔ©çUÈãÌPÊÉ½Çè­Å¬C
int dp[1 << 20];
// s«æ
int U;
int n;

int dfs(int s, int sum) {
  if (dp[s] != -1)
    return dp[s];
  else if (sum >= U) {
    dp[s] = 0;
    return dp[s];
  } else {
    int minCost = 1000000;
    // bool used[21];
    // for(int i = 0; i < n; i++){
    //	if((s>>i)&1)
    //		used[i]=true;
    // }
    //  Â¬ÉÇ±ÖJÚ·é©
    // for(int i = 0; i < tos[s].size(); i++){
    //	minCost=min(minCost,dfs(s|(1<<(tos[s][i])),sum+tani[tos[s][i]])+1);
    //	if(minCost==1)
    //		break;
    // }
    for (int i = 0; i < n; i++) {
      // Ü¾JÚµÄÈ©Á½ç
      if (!((s >> i) & 1)) {
        if (((needs[i]) & s) == needs[i]) {
          minCost = min(minCost, dfs(s | (1 << i), sum + tani[i]) + 1);
          if (minCost == 1)
            break;
        }
        // for(int j = 0; j < vpii[i].second.size(); j++){
        //	if(!used[vpii[i].second[j]]){
        //		f=true;
        //		break;
        //	}
        // }
        // if(!f)
        //	minCost=min(minCost,dfs(s|(1<<i),sum+vpii[i].first)+1);
      }
    }
    dp[s] = minCost;
    return dp[s];
  }
}

int main() {

  int c, k;
  int t;
  int tn;
  while (cin >> n >> U && !(n == 0 && U == 0)) {
    fill(dp, dp + (1 << 20), -1);
    for (int i = 0; i < n; i++) {
      cin >> tani[i] >> k;
      needs[i] = 0;
      for (int j = 0; j < k; j++) {
        cin >> t;
        needs[i] |= (1 << t);
      }
      // needs[i]=tn;
    }
    // for(int s = 0; s < (1<<n); s++){
    //	for(int i = 0; i < n; i++){
    //		if(!((s>>i)&1)){
    //			if(((needs[i])&s)==needs[i]){
    //				tos[s].push_back(i);
    //			}
    //		}
    //	}
    // }
    cout << dfs(0, 0) << endl;
    // for(int i = 0; i < (1<<n); i++)
    //	tos[i].clear();
  }
  return 0;
}