化工厂装箱员

【问题描述】

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需要的最少的装箱次数。

【输入样例】worker.in

11

A

B

C

A

B

C

A

B

C

A

B

【输出样例】worker.out

3

//动态规划
#include<cstdio>
#include<cstdlib>
int n,i;
int f[150][11][11][11];
bool g[150][11][11][11];
int data[150];

int min(int a,int b)
{
    if (a<b) return a; else return b;
}

int dp(int k,int a,int b,int c)
{
    int i,j=a+b+c;
    for (i=1;i<=10-j;i++)
    {
        k++;
        if (k>n) break;
        if (data[k]==1) a++;
        if (data[k]==2) b++;
        if (data[k]==3) c++;
    }
    if (k>=n) 
    {
        g[n][a][b][c]=1;
        f[n][a][b][c]=(a>0)+(b>0)+(c>0);
        return f[n][a][b][c];
    }
    if (!g[k][a][b][c])
    {
        g[k][a][b][c]=1;
        f[k][a][b][c]=100000;
        if (a>0) f[k][a][b][c]=min(f[k][a][b][c],dp(k,0,b,c)+1);
        if (b>0) f[k][a][b][c]=min(f[k][a][b][c],dp(k,a,0,c)+1);
        if (c>0) f[k][a][b][c]=min(f[k][a][b][c],dp(k,a,b,0)+1);
    }
	return f[k][a][b][c];
}


int main()
{
    freopen("worker.in","r",stdin);
    //freopen("worker.out","w",stdout);
    scanf("%d\n",&n);
    char c;
    for (i=1;i<=n;i++)
    {
        scanf("%c\n",&c);
        data[i]=c-64;
    } 
    int ans=dp(0,0,0,0);
    printf("%d\n",ans);
    //system("pause");
    return 0;
}

原文链接: https://www.cnblogs.com/sprayoflearn/archive/2010/10/13/1849947.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    化工厂装箱员

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/16079

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午4:14
下一篇 2023年2月7日 下午4:14

相关推荐