結果

提出番号 2088
提出者 ei1333
言語 C++
提出日時 2018-08-04 15:14:05
問題名 (66)Cut onion
結果 TLE
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 4ms 21264KB
2 AC 100% 4ms 21280KB
3 AC 100% 4ms 21264KB
4 TLE 0% 10586ms 21280KB
5 AC 100% 4ms 21264KB
6 AC 100% 751ms 21280KB
7 TLE 0% 20002ms 0KB
8 TLE 0% 20002ms 0KB
9 TLE 0% 20002ms 0KB
10 TLE 0% 20001ms 0KB
11 TLE 0% 20001ms 0KB
12 TLE 0% 20001ms 0KB
13 TLE 0% 20002ms 0KB
14 AC 100% 8ms 22272KB
15 TLE 0% 20002ms 0KB
16 TLE 0% 20002ms 0KB
17 TLE 0% 20002ms 0KB
18 TLE 0% 20002ms 0KB
19 TLE 0% 20002ms 0KB
20 TLE 0% 20002ms 0KB

ソースコード

#include <bits/stdc++.h>

using namespace std;

using int64 = long long;
const int INF = 1 << 29;

int dp[1 << 16][16];
int ok[1 << 16];

int rec(int bit, int beet) {
  if(beet == 0) return INF;
  if(~dp[bit][beet]) return dp[bit][beet];
  int ret = ok[bit];
  for(int i = bit & (bit - 1); i > 0; i = (i - 1) & bit) {
    for(int j = 0; j <= beet; j++) {
      ret = min(ret, rec(i, beet - j) + rec(bit ^ i, j));
    }
  }
  return ret;
}

int main() {
  int N, K, B, A[16];
  cin >> N >> K >> B;
  for(int i = 0; i < N; i++) cin >> A[i];
  for(int i = 0; i < 1 << N; i++) {
    ok[i] = __builtin_popcount(i);
    int sum = 0;
    for(int j = 0; j < N; j++) {
      if((i >> j) & 1) sum += A[j];
    }
    if(sum <= B) --ok[i];
  }
  memset(dp, -1, sizeof(dp));
  cout << rec((1 << N) - 1, K) << endl;
}