这是个变化的0-1背包问题。
俩个人洗衣服必须把同一种颜色的洗完,才可以洗下一种颜色的衣服。有多少种颜色的衣服就有多少个背包来处理吧!!!
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char ss[13][13],c[13];
int dp[100008],total[12];
int mun;
struct node{
int a,b;
}q[108];
bool cmp(node x,node y){
return x.b<y.b;
}
int main(){
int n,m,i,j,sum;
char c[13];
while(scanf("%d%d",&n,&m) && n && m){
mun=sum=0;
memset(total,0,sizeof(total));
for(i=1;i<=n;i++){
cin>>c;
strcpy(ss[mun++],c); //把各种颜色放入数组里面
}
//printf("%d\n",mun);
for(i=1;i<=m;i++){
cin>>q[i].a>>c;
for(j=0;j<mun;j++){
if(!strcmp(ss[j],c)){ //判断,并把颜色分组,并标记下标。。。。。
q[i].b=j;break;
}
}
total[q[i].b]+=q[i].a; //统计同一种颜色衣服的件数。。。
}
//printf("%d %d %d\n",total[0],total[1],total[2]);
sort(q+1,q+1+m,cmp);
j=0;
for(i=0;i<mun;i++){ //求标记为i的颜色的时间
memset(dp,0,sizeof(dp));
for( ; q[j].b==i && j<=m ; j++){
//printf(" %d %d %d\n",j,q[i].b,i);
for(int z=total[i]/2;z>=q[j].a;z--){
dp[z]=max(dp[z],dp[z-q[j].a]+q[j].a);
}
}
//printf("\n%d %d\n",dp[total[i]/2],j);
sum+=total[i]-dp[total[i]/2];
}
printf("%d\n",sum);
}
return 0;
}
路途。。。。