-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy path10086-Test the Rods.cpp
61 lines (58 loc) · 1.65 KB
/
10086-Test the Rods.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <bits/stdc++.h>
using namespace std;
int t1,t2,n,m,cost;
vector<int> sites;
vector<vector<int>> ncpcCost;
vector<vector<int>> bcewCost;
int memo[301][301][31];
int choice[301][301][31];
int topdown(int remNCPC, int remBCEW, int idx){
if(idx == n) return 0;
if(memo[remNCPC][remBCEW][idx] != -1)
return memo[remNCPC][remBCEW][idx];
int best = 1e7;
for(int a=0;a<=sites[idx];a++){
int b = sites[idx] - a;
if(a>remNCPC || b>remBCEW) continue;
int res = topdown(remNCPC-a,remBCEW-b,idx+1);
res += (ncpcCost[idx][a] + bcewCost[idx][b]);
if(res < best){
best = res;
choice[remNCPC][remBCEW][idx] = a;
}
}
return memo[remNCPC][remBCEW][idx] = best;
}
int main()
{
while(scanf("%d %d",&t1,&t2), t1||t2){
scanf("%d",&n);
sites.clear();
ncpcCost.clear();
bcewCost.clear();
memset(memo,-1,sizeof memo);
for(int i=0;i<n;i++){
scanf("%d",&m);
vector<int> siteA(1,0);
vector<int> siteB(1,0);
for(int j=0;j<2*m;j++){
scanf("%d",&cost);
if(j<m) siteA.push_back(cost);
else siteB.push_back(cost);
}
sites.push_back(m);
ncpcCost.push_back(siteA);
bcewCost.push_back(siteB);
}
printf("%d\n",topdown(t1,t2,0));
for(int i=0;i<n;i++){
int a = choice[t1][t2][i];
int b = sites[i]-a;
printf("%d",a);
if(i+1 == n) printf("\n");
else printf(" ");
t1 -= a; t2 -= b;
}
printf("\n");
}
}