这道题算是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;
}