题意: 两个人洗衣服, 每种颜色的衣服有多件, 要求两人只能同时洗相同颜色的衣服, 求洗衣服的最短时间;
这道题虽然简单, 但是是很好的一道题,需要多思考一步
分组的0 1背包
思路:因为只能同时洗相同颜色的衣服, 因此将不同颜色看为不同的组, 分别求出来每组的最短时间, 其和即为所求;每组最短时间其实就是0 1背包;
无语的是, 我在结构体中多加了一个够着函数, 结果一直超时……去掉后立即就AC了……
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct Node
{
char color[20];
int num;
int time[101];
int sum;
//无语, 我加上这个竟然超时!!!让我交了25+次,
//不知道为啥?
/*
Node()
{
sum=0;
num=0;
}
*/
}node[15];
int main()
{
int m, n, time;
char color[20];
int dp[100000];
while(scanf("%d%d", &m, &n) &&(m+n))
{
for(int i=0; i<m; i++)
{
scanf("%s", node[i].color);
node[i].num=node[i].sum =0;
}
for(int i=0; i<n; i++)
{
scanf("%d %s", &time, color);
for(int j=0; j<m; j++)
{
if(strcmp(node[j].color, color) == 0)
{
int temp = node[j].num;
node[j].time[temp] = time;
node[j].sum += time;
node[j].num++;
break;
}
}
}
int ans = 0;
for(int i=0; i<m; i++)
{
int sum = node[i].sum/2;
memset(dp,0, sizeof(dp));
for(int j=0; j<node[i].num; j++)
{
for(int k=node[i].sum/2; k>=node[i].time[j];k--)
{
dp[k] = max(dp[k], dp[k-node[i].time[j]]+node[i].time[j]);
}
}
ans += (node[i].sum-dp[sum]);
}
printf("%d\n", ans);
}
}