POJ 3211

 这是个变化的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;
}

路途。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值