poj 3221 Washing Clothes(分组的0 1背包)

来源:互联网 发布:qq飞车刷点卷软件下载 编辑:程序博客网 时间:2024/04/30 00:02

题意:  两个人洗衣服, 每种颜色的衣服有多件, 要求两人只能同时洗相同颜色的衣服, 求洗衣服的最短时间;

这道题虽然简单, 但是是很好的一道题,需要多思考一步 

分组的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);     }  } 


原创粉丝点击