Problem:
B - Doctor Course Is Recommended / D進どうですか？
Story
DのひとはD進を決意したので、博士後期課程入学試験を受けることにした。筆記試験はマークシート形式であった。自身の専門分野の問題ばかりだったので、Dのひとはすぐにすべての正答を導くことができた。しかし、ここで大きな問題に気づいた。Dのひとは宗教上の理由から、解答用紙には'D'としか書くことができなかったのだ。また、'D'と書くためには尋常ではない集中力を使うため，'D'と書くことのできる個数も決まっている。Dのひとが本当にD進することができるか調べるため、解答・配点を踏まえ、上記の条件を満たした上で得られる最大の得点を求めてみよう。
Problem
'A','B','C','D','E'の
5
択からなるマークシート問題がある。
1
つの解答欄は空欄
1
マス、もしくは
2
マスから構成されており、それぞれの解答欄について、マス全てが想定されている解答と等しいとき、解答欄に割り当てられた点数を得る。解答欄毎の解答と配点が与えられる。
D
個のマスまで'D'とマークし、残りのマスを空マスにしなければならないとき、得られる点数の最大値を求めよ。
Input
入力は以下の形式で与えられる。
D
x
a_1
p_1
...
a_x
p_x
y
b_1
c_1
q_1
...
b_y
c_y
q_y
1
行目は、'D'と書くことのできる最大回数を表す
1
つの整数
D
からなる。
2
行目は、空欄
1
マスからなる解答欄の個数を表す
1
つの整数
x
からなる。 続く
x
行は、空欄
1
マスからなる解答欄の情報が与えられる。
i+2
行目(
1 \leq i \leq x
)は空欄
1
マスからなる
i
番目の解答欄の正答を表す文字
a_i
、配点を表す整数
p_i
が空白区切りで書かれている。
x+3
行目は、空欄
2
マスからなる解答欄の個数を表す
1
つの整数
y
からなる。 続く
y
行は、空欄
2
マスからなる解答欄の情報が与えられる。
j+x+3
行目(
1 \leq j \leq y
)は空欄
2
マスからなる
j
番目の解答欄の正答を表す
2
つの文字
b_j
と
c_j
、配点を表す整数
q_j
からなる。
b_j
と
c_j
の間に空白は存在しないが、
c_j
と
q_j
の間は空白で区切られている。
制約:
1 \leq D \leq 13
(=0xD)
0 \leq x
,
0 \leq y
,
1 \leq x + 2y \leq 20
a_i
,
b_j
,
c_j
\in \{A,B,C,D,E\}
Output
上記の制約を満たして得られる最大得点を1行に出力せよ。行の最後では必ず改行を行うこと。
Sample Input 1
2
3
D 30
D 50
D 20
0
Sample Output 1
80
1,2番目の解答欄にDと記入し、3番目の解答欄を空白とすることで最大得点80が得られる。
Sample Input 2
4
0
2
DB 60
DD 40
Sample Output 2
40
2つのマスからなる解答欄は両方とも正解しなければ得点が得られない。
Sample Input 3
13
2
C 15
A 23
2
BD 42
EE 20
Sample Output 3
0
D進だめです。
Sample Input 4
3
3
D 10
D 15
D 45
1
DD 30
Sample Output 4
75
Sample Input 5
3
3
D 25
D 20
D 25
1
DD 30
Sample Output 5
70

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> P;

int main(){
    int d; cin>>d;
    int x; cin>>x;
    vector<P> score;
    for(int i=0; i<x; i++){
        char a; cin>>a;
        int p; cin>>p;
        if(a == 'D'){
            score.emplace_back(p, 1);
        }
    }

    int y; cin>>y;
    for(int i=0; i<y; i++){
        string b; cin>>b;
        int q; cin>>q;
        if(b == "DD"){
            score.emplace_back(q, 2);
        }
    }

    int n = score.size();

    int ans = 0;
    for(int bit=0; bit<(1<<n); bit++){
        int sum = 0;
        int need = 0;
        for(int i=0; i<n; i++){
            if((1<<i) & bit){
                sum += score[i].first;
                need += score[i].second;
            }
        }

        if(need <= d){
            ans = max(ans, sum);
        }
    }

    cout << ans << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3168
final_rank: 10

code_snippet: #include "iostream"
#include "random"
#include "string"
#include "bitset"
#include "algorithm"
#include "map"
#include "queue"
#include "list"
#include "set"
#include "climits"
#include "iomanip"

using namespace std;
using ll = long long int;


int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	ll d, x;
	cin >> d >> x;
	vector<string> a;
	vector<ll> p;
	for (int i = 0; i < x; ++i) {
		string s;
		ll q;
		cin >> s >> q;
		a.push_back(s);
		p.push_back(q);
	}
	ll y;
	cin >> y;
	for (int i = 0; i < y; ++i) {
		string s;
		ll q;
		cin >> s >> q;
		a.push_back(s);
		p.push_back(q);
	}

	ll n = x + y, ret = 0;
	for (ll i = 0; i < (1LL << n); ++i) {
		ll cnt = 0, score = 0;
		for (ll j = 0; j < n; ++j) {
			if (i & 1LL << j) {
				if (j < x) {
					if (a[j] == "D") {
						cnt++;
						score += p[j];
					}
					else {
						cnt = 1000;
					}
				}
				else {
					if (a[j] == "DD") {
						cnt += 2;
						score += p[j];
					}
					else {
						cnt = 1000;
					}
				}
			}

			if (cnt <= d) {
				ret = max(ret, score);
			}
		}
	}

	cout << ret << endl;
}
accuracy: 1
time_ms: 110
memory_kb: 3240
final_rank: 13

code_snippet: #include<iostream>
#include<vector>
using namespace std;

int main(){
    int d, x, y;
    cin >> d >> x;

    vector<int> v;
    char a;
    int p;
    for(int i = 0; i < x; i++){
        cin >> a >> p;
        if(a == 'D')    v.push_back(p);
        else            v.push_back(0);
    }

    cin >> y;
    string bc;
    int q;
    for(int i = 0; i < y; i++){
        cin >> bc >> q;
        if(bc == "DD")  v.push_back(q);
        else            v.push_back(0);
    }

    int ans = 0;
    for(int s = 0; s < 1<<(x+2*y); s++){
        int popcnt = 0, score = 0;
        for(int j = 0; j < x; j++){
            if((s>>j)&1)    popcnt++, score += v[j];
        }
        for(int j = 0; j < y; j++){
            if((s>>(x+2*j))&1 && (s>>(x+2*j+1))&1)  popcnt += 2, score += v[x+j];
        }
        if(popcnt <= d) ans = max(ans, score);
    }

    cout << ans << endl;

    return 0;
}
accuracy: 1
time_ms: 40
memory_kb: 3208
final_rank: 12

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;

typedef pair<int, int> P;


int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	vector<P> p;
	int D, x, y, a;
	cin >> D;
	cin >> x;
	string s;
	for(int i = 0; i < x; i++) {
		cin >> s >> a;
		if(s == "D") p.push_back({ 1, a });
	}
	cin >> y;
	for(int i = 0; i < y; i++) {
		cin >> s >> a;
		if(s == "DD") p.push_back({ 2, a });
	}

	int N = p.size();
	int ans = 0;
	for(int i = 1; i < 1 << N; i++) {
		int Dsum = 0, score = 0;
		for(int j = 0; j < N; j++) {
			if(i >> j & 1) {
				Dsum += p[j].first;
				score += p[j].second;
			}
		}
		if(Dsum <= D) ans = max(ans, score);
	}
	cout << ans << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 3232
final_rank: 11

code_snippet: #include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> iip;

vector<iip> point;
int D, x, y;

int solve(int idx, int d)
{
  if(d <= 0) return 0;
  if(idx == point.size()) return 0;
  
  if(d >= point[idx].first) 
    return max(solve(idx+1, d), solve(idx+1, d-point[idx].first) + point[idx].second);
  else return solve(idx+1, d);
}

int main()
{
  cin >> D;
  cin >> x;
  for(int i = 0; i < x; i++){
    string a;
    int p;
    cin >> a >> p;
    point.push_back(iip(1, p*(a == "D")));
  }
  cin >> y;
  for(int i = 0; i < y; i++){
    string b;
    int q;
    cin >> b >> q;
    point.push_back(iip(1, 0));
    point.push_back(iip(2, q*(b=="DD")));
  }
  cout << solve(0, D) << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1216
final_rank: 2

code_snippet: #include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
	int n;
	cin >> n;
	vector<pair<string, int>> v;

	int a;
	cin >> a;
	for(int i=0; i < a; i++){
		string b; int c;
		cin >> b >> c;
		if(b == "D") v.push_back(make_pair(b, c));
	}
	cin >> a;
	for(int i=0; i < a; i++){
		string b; int c;
		cin >> b >> c;
		if(b == "DD") v.push_back(make_pair(b, c));
	}
	int ret = 0;
	for(long long S = 0; S < (1 << v.size()); S++){
		int p = 0;
		int count = n;
		for(int i=0; i < v.size(); i++) if(S >> i & 1){count -= v[i].first.size(); p += v[i].second;}
		if(0 <= count) ret = max(ret, p);
	}
	cout << ret << endl;
}
accuracy: 1
time_ms: 20
memory_kb: 1220
final_rank: 7

code_snippet: #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cassert>
#include <vector>
#include <string>
#include <cmath>
#include <map> 
#include <sstream>
#include <cstdio>
using namespace std;
 
const int MAX= 10000100;

#define loop(i,a,b) for(int i = a ; i < b ; i ++)
#define rep(i,a) loop(i,0,a)
#define all(a) (a).begin(),(a).end()
#define ll long long int
#define gcd(a,b) __gcd(a,b)
#define pb(a) push_back(a)
int GCD(int a, int b) {if(!b) return a; return gcd(b, a%b);}
int lcm(int a, int b) {return a*b / gcd(a, b);}

int main(void){
  int k,x,y;
  vector<int> di;
  vector<string> ds;
  
  cin>>k;
  cin>>x;
  rep(i,x){
    int ini;
    string ins;
    cin>>ins;
    cin>>ini;
    bool used = false;
    rep(i,ins.size()){
      if(ins[i] != 'D'){
	used = true;
	break;
      }
    }
    if(used)continue;
    di.push_back(ini);
    ds.push_back(ins);
  }

  cin>>y;
  rep(i,y){
    int ini;
    string ins;
    cin>>ins;
    cin>>ini;
    bool used = false;
    rep(i,ins.size()){
      if(ins[i] != 'D'){
	used = true;
	break;
      }
    }
    if(used)continue;
    di.push_back(ini);
    ds.push_back(ins);
  }
  int res = 0;
  for(int i = 0 ; i < int(1 << di.size()) ; i++){
    int cnt = 0;
    int sum = 0;
    bool used = false;
    for(int j = 0 ; j < di.size() ; j ++){
      if((i/(1<<j))%2){
	//cout<<j<<" ";
	cnt += ds[j].size();
	if(cnt > k){
	  used = true;
	  break;
	}
	sum += di[j];
      }
    }		
    if(used){
      continue;
    }
    //cout<<"cnt"<<cnt<<" ";
    res = max(sum,res);
    //cout<<endl;
  }
  cout<<res<<endl;
}
accuracy: 1
time_ms: 30
memory_kb: 1236
final_rank: 8

code_snippet: #include<iostream>
using namespace std;

int D,x,y;
string a[30];
int p[30];


int calc(int bit){
  int sum = 0;
  for(int i=0;i<x;i++){
    if( (bit>>i&1) && a[i] == "D")sum += p[i];
  }
  for(int i=0;i<y;i++){
    if( (bit>>(x+2*i)&1) && (bit>>(x+2*i+1)&1) && a[x+i] == "DD")
      sum += p[x+i];
  }
  return sum;
}


int main(){
  cin >> D;

  cin >> x;
  for(int i=0;i<x;i++)cin >> a[i] >> p[i];

  cin >> y;
  for(int i=0;i<y;i++)cin >> a[x+i] >> p[x+i];

  D = min(D, x+2*y);

  int res = 0;
  int comb = (1<<D) -1;
  while( comb < (1<<(x+2*y)) ){
    
    res = max(res, calc(comb));

    int x = comb & -comb, y = comb + x;
    comb = ( ( (comb & ~y) /x ) >> 1) | y;
  }
  cout << res << endl;
}
accuracy: 1
time_ms: 20
memory_kb: 1212
final_rank: 5

code_snippet: #include <iostream>
#include <complex>
#include <sstream>
#include <string>
#include <algorithm>
#include <deque>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <vector>
#include <set>
#include <limits>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
#define REP(i, j) for(int i = 0; i < (int)(j); ++i)
#define FOR(i, j, k) for(int i = (int)(j); i < (int)(k); ++i)
#define SORT(v) sort((v).begin(), (v).end())
#define REVERSE(v) reverse((v).begin(), (v).end())
typedef pair<int, int> P;
#define n first
#define cnt second

int main() {
  int D; cin >>D;
  vector<P> ps;
  int x, y, n; cin >>x;
  string s;
  REP(i, x){
    cin >>s >>n;
    if(s[0] == 'D') ps.push_back(P(n, 1));
  }
  cin >>y;
  REP(i, y){
    cin >>s >>n;
    if(s == "DD") ps.push_back(P(n, 2));
  }
  int ans = 0;
  int N = ps.size();
  REP(i, (1 << N)){
    int cnt = 0, sum = 0;
    REP(j, N) if((1 << j) & (i)) { cnt += ps[j].cnt; sum += ps[j].n; }
    if(cnt <= D) ans = max(ans, sum);
  }
  cout <<ans <<endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1216
final_rank: 2

code_snippet: #include<bits/stdc++.h>
using namespace std;

int d,x,y;
string a[20],b[20];
int p[20],q[20];
bool ac[20];

int rec(int depth, int use){
  if(depth == x+2*y){
    int sum = 0;
    for(int i=0;i<x;i++){
      if(ac[i])sum += p[i];
    }
    for(int j=0;j<y;j++){
      if(ac[x+2*j] && ac[x+2*j+1])sum += q[j];
    }
    return sum;
  }

  int res = rec(depth+1,use);
  
  if(use<d){
    if(depth<x){
      if(a[depth][0] == 'D')ac[depth] = true;
    }else{
      if(b[(depth-x)/2][(depth-x)%2] == 'D')ac[depth] = true;
    }
    res = max(res, rec(depth+1,use+1));
    ac[depth] = false;
  }

  return res;
}

int main(){
  cin >> d;
  cin >> x;
  for(int i=0;i<x;i++)cin >> a[i] >> p[i];
  cin >> y;
  for(int j=0;j<y;j++)cin >> b[j] >> q[j];

  for(int i=0;i<x+2*y;i++)ac[i] = false;
  cout << rec(0,0) << endl;
}
accuracy: 1
time_ms: 50
memory_kb: 1204
final_rank: 9

code_snippet: #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
typedef pair<int, int> P;
 
int main(){
    int D;
    cin >> D;
    int x, y;
    vector<P> v;
    cin >> x;
    while (x--){
        string s;
        cin >> s;
        int p;
        cin >> p;
        if (s == "D") v.push_back(make_pair(1, p));
    }
    cin >> y;
    while (y--){
        string s;
        cin >> s;
        int p;
        cin >> p;
        if (s == "DD") v.push_back(make_pair(2, p));
    }
 
    int n = v.size();
 
    int ans = 0;
    for (int i = 0; i < (1 << n); ++i){
        int cost = 0, tmp = 0;
        for (int j = 0; j < n; ++j){
            if (i&(1 << j)){
                cost += v[j].first;
                tmp += v[j].second;
            }
        }
        if (cost <= D) ans = max(ans, tmp);
    }
    cout << ans << endl;
 
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1216
final_rank: 2

code_snippet: #include<iostream>
using namespace std;

int D,x,y;
string a[30];
int p[30];

bool use[30];

int calc(void){
  int sum = 0;
  for(int i=0;i<x;i++){
    if(use[i] && a[i] == "D")sum += p[i];
  }
  for(int i=0;i<y;i++){
    if(use[x+2*i] && use[x+2*i+1] && a[x+i] == "DD")sum += p[x+i];
  }
  return sum;
}

int rec(int depth, int rem){
  if(depth == x+2*y)return calc();

  int res = 0;
  if(depth+rem < x+2*y){
    res = max(res, rec(depth+1,rem) );
  }
  if(rem){
    use[depth] = true;
    res = max(res, rec(depth+1,rem-1) );
    use[depth] = false;
  }
  return res;
}

int main(){
  cin >> D;

  cin >> x;
  for(int i=0;i<x;i++)cin >> a[i] >> p[i];

  cin >> y;
  for(int i=0;i<y;i++)cin >> a[x+i] >> p[x+i];

  D = min(D,x+2*y);
  cout << rec(0,D) << endl;
}
accuracy: 1
time_ms: 20
memory_kb: 1212
final_rank: 5

code_snippet: #include<iostream>

using namespace std;

#define rep(i, n) for (int i = 0; i < int(n); ++i)

int main() {
  int d, x, y;
  cin >> d >> x;
  string a[x];
  int p[x];
  rep (i, x) {
    cin >> a[i] >> p[i];
    if (a[i] != "D") {
      --i;
      --x;
    }
  }
  cin >> y;
  string b[y];
  int q[y];
  rep (i, y) {
    cin >> b[i] >> q[i];
    if (b[i] != "DD") {
      --i;
      --y;
    }
  }
  int res = 0;
  rep (bit, 1 << (x + y)) {
    int cnt = 0, r = 0;
    rep (i, x) if ((bit >> i) & 1) {
      ++cnt;
      r += p[i];
    }
    rep (i, y) if ((bit >> (x + i)) & 1) {
      cnt += 2;
      r += q[i];
    }
    if (cnt <= d) res = max(res, r);
  }
  cout << res << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 1