題意: 兩個人洗衣服, 每種顏色的衣服有多件, 要求兩人只能同時洗相同顏色的衣服, 求洗衣服的最短時間;
這道題雖然簡單, 但是是很好的一道題,需要多思考一步
分組的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);
}
}