poj 3211 Washing Clothes 01背包

针对衣物洗涤问题,本文介绍了一种通过颜色分组并利用01背包算法优化洗衣时间的方法。该算法首先按颜色对衣物进行分组,然后计算各组的最优洗衣时间分配,以确保整体洗衣时间最短。
#include <stdio.h>
#include <string.h>
int f[50000];
int c[3500],w[3500];
char color[11][11];
int max(int a,int b)
{
    return a>b?a:b;
}
struct node{
    int a;
    char b[11];
}e[101];
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        if(m==0&&n==0)
            break;
        int s=0,i,j,k,t,sum,mm,p,q;
        for(i=0;i<m;i++)
            scanf("%s",color[i]);
        for(i=0;i<n;i++)
            scanf("%d%s",&e[i].a,e[i].b);
        for(i=0;i<m;i++)
        {
            t=sum=0;
            for(j=0;j<n;j++) //找出颜色相同的衣服
                if(strcmp(e[j].b,color[i])==0)
                {
                    c[t++]=e[j].a;
                    sum+=e[j].a;
                }
            memset(f,0,sizeof(f));
            f[0]=1;
            mm=sum/2;//分成两堆衣服来洗,两堆差越小越好,由01背包完成分组
            for(p=0;p<t;p++)
            {
                for(q=mm;q>=c[p];q--)
                    if(f[q-c[p]]!=0)
                    f[q]=max(f[q],f[q-c[p]]+1);
            }
            for(p=mm;p>=0;p--)
                if(f[p]!=0)
                break;
            s+=sum-p;
        }
        printf("%d\n",s);
    }
    return 0;
}
该题目意思是两人洗衣服,只有洗完同种颜色的衣服才能洗其他颜色的,求最少洗衣时间
思路是根据颜色分组,计算每组需要多少的时间才能洗完;
将洗衣服的总时间对半分后,由01背包可以得到最接近对半分的值,即两数中较大值最小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值