poj 3211 Washing Clothes 背包

这个真是幸福题 题目描述。。。。

说说解法吧

简单的01背包

不同颜色的衣服互不干扰

所以只要解决同种颜色的衣服最少时间就行了

做一次01背包。然后对于每个可行状态j 时间为max(j,sum-j)

最后作和

 

#include
#include
#include
using namespace std;
const int inf=1000000;
int a[101][101],lon[101];
char t[101][20];
int ans[100001];
int main()
{
    while(1)
    {
    int n,m;
    scanf("%d %d",&n,&m);

    if(n==0&&m==0) break;

    memset(t,0,sizeof(t));
    memset(lon,0,sizeof(lon));

    for(int i=1;i<=n;i++)
    scanf("%s",t[i]);
    for(int i=1;i<=m;i++)
    {
        int time;
        char tmp[12];
        memset(tmp,0,sizeof(tmp));
        scanf("%d %s",&time,tmp);
        for(int k=1;k<=n;k++)
        if(strcmp(tmp,t[k])==0)
        {
            a[k][++lon[k]]=time;
            break;
        }
    }
    int answer=0;
    for(int k=1;k<=n;k++)
    {
        int tmp=inf;
        memset(ans,0,sizeof(ans));
        ans[0]=1;
        for(int i=1;i<=lon[k];i++)
        for(int j=100000-a[k][i];j>=0;j--)
        if(ans[j])
        ans[j+a[k][i]]=1;

        int sum=0;
        for(int i=1;i<=lon[k];i++)
        sum+=a[k][i];

        for(int i=0;i<=100000;i++)
        if(ans[i]&&max(sum-i,i)         tmp=max(sum-i,i);
        answer+=tmp;
    }
    printf("%d\n",answer);
    }

    return 0;
}

你可能感兴趣的:(动态规划dp)