搜索 洛谷P2530 [SHOI2001]化工厂装箱员

P2530 [SHOI2001]化工厂装箱员

题目描述

��118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度的成品分开装箱,装箱员grant第1次顺序从流水线上取10个成品(如果一共不足10个,则全部取出),以后每一次把手中某种纯度的成品放进相应的箱子,然后再从流水线上顺序取一些成品,使手中保持10个成品(如果把剩下的全部取出不足10个,则全部取出),如果所有的成品都装进了箱子,那么grant的任务就完成了。

��由于装箱是件非常累的事情,grant希望他能够以最少的装箱次数来完成他的任务,现在他请你编个程序帮助他。

输入输出格式

输入格式:

��第1行为n(1<=n<=100),为成品的数量

��以后n行,每行为一个大写字母A,B或C,表示成品的纯度。

输出格式:

��仅一行,为grant需要的最少的装箱次数。

输入输出样例

输入样例#1:
11
A
B
C
A
B
C
A
B
C
A
B
输出样例#1:
3

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n;
 7 int data[110],f[110][11][11][11];
 8 char a;
 9 bool check[110][11][11][11];
10 int dfs(int num,int x,int y,int z){
11     int tot=x+y+z;
12     int tmp=0;
13     for(int i=n-num+1;i<=n;i++){
14         if(tot+tmp==10) break;
15         if(data[i]==0) x++;
16         if(data[i]==1) y++;
17         if(data[i]==2) z++;
18         tmp++;
19     }
20     if(check[num-tmp][x][y][z]) return f[num-tmp][x][y][z];
21     check[num-tmp][x][y][z]=1;
22     if(num==tmp){
23         int t=3;
24         if(x==0) t--;
25         if(y==0) t--;
26         if(z==0) t--;
27         f[0][x][y][z]=min(f[0][x][y][z],t);
28         return f[0][x][y][z];
29     }
30     if(x) f[num-tmp][x][y][z]=min(f[num-tmp][x][y][z],dfs(num-tmp,0,y,z)+1);
31     if(y) f[num-tmp][x][y][z]=min(f[num-tmp][x][y][z],dfs(num-tmp,x,0,z)+1);
32     if(z) f[num-tmp][x][y][z]=min(f[num-tmp][x][y][z],dfs(num-tmp,x,y,0)+1);
33     return f[num-tmp][x][y][z];
34 }
35 int main(){
36     scanf("%d",&n);
37     for(int i=1;i<=n;i++){
38         //scanf("%c",&a);
39         cin>>a;
40         data[i]=a-'A';
41     }
42     memset(f,0x3f3f3f3f,sizeof(f));
43     printf("%d",dfs(n,0,0,0));
44     return 0;
45 }
原文地址:https://www.cnblogs.com/zwube/p/7008841.html