您的位置:首页 > 其它

poj Washing Clothes挺好的一道01背包

2011-08-17 18:44 246 查看
这道题算是01背包的的灵活运用吧!!!挺好的一道题,先说说思路,先用结构体存时间,和衣服颜色 再将颜色排个序,一样的颜色放一起,然后将同一种的颜色时间加一起sum,sum在除2,对这个进行01背包,尽量能取到sum的中间值,这样消耗的时间最少。

#include<iostream>

using namespace std;

#include<algorithm>

int temp[11];

int dp[100009];

struct node

{

int time;

char clo[11];

}a[105];//用结构体存时间,和衣服颜色

bool cmp(node a,node b)//对衣服进行排序

{

return strcmp(a.clo,b.clo)>0;

}

int main()

{

int m,n;

int b[105];

while(cin>>m>>n,m||n)

{

for(int i=0;i<=100009;i++)//对数组初始化

dp[i]=0;

while(m--)

scanf("%s",temp);

for(int i=1;i<=n;i++)

scanf("%d%s",&a[i].time,a[i].clo);

a[n+1].clo[0]='0';//这个不能忘啊

sort(a+1,a+1+n,cmp);//

int cou=1;

int sum=0;

int tsum=0;

int time;

int sign=0;

for(int i=1;i<=n;i++)

{

if(strcmp(a[i].clo,a[i+1].clo)==0)

{

b[cou++]=a[i].time;//将一种衣服颜色放在数组b里

sum+=a[i].time;

}

else

{

b[cou++]=a[i].time;

sum+=a[i].time;

int t=sum/2;

for(int i=1;i<cou;i++)//01背包的过程

{

for(int j=t;j>=b[i];j--)

{

dp[j]=max(dp[j-b[i]]+b[i],dp[j]);

}

}

time=max(dp[t],sum-dp[t]);

sign=1; //计算完一种颜色的衣服后,别忘了初始化

cou=1;//计算完一种颜色的衣服后,别忘了初始化

sum=0; //计算完一种颜色的衣服后,别忘了初始化

for(int i=0;i<=100009;i++)//计算完一种颜色的衣服后,别忘了初始化

dp[i]=0;

}

if(sign==1)//将每种颜色的衣服加起来

{

tsum+=time;

sign=0;

}

}

cout<<tsum<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: