搜索 洛谷P2530 [SHOI2001]化工厂装箱员
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索 洛谷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 }
以上是关于搜索 洛谷P2530 [SHOI2001]化工厂装箱员的主要内容,如果未能解决你的问题,请参考以下文章